HotXLS-dokumentasjon

Sparsom disposisjonsgeometri

Enheten lxOutline gir motoruavhengig geometri og mutasjonsplanlegging for rad- og kolonnedisposisjoner
Den lagrer bare materialiserte spenn, gjenkjenner oppsummeringsnoder fra tilstøtende overganger i disposisjonsnivå og lager komprimerte tilstandsendringer for oppsett med oppsummering etter og oppsummering før, uten å tildele en oppføring for hvert regnearkkoordinat

Kjerneetyper

TXLSOutlineAxis = (xoaRows, xoaColumns);

TXLSOutlineChildMode = (xocPreserve, xocCollapse, xocExpand);

TXLSOutlineMutationPlan = class
  constructor Create(AAxis: TXLSOutlineAxis);
  procedure Clear;
  property Axis: TXLSOutlineAxis;
  property Count: Integer;
  property Changes[Index: Integer]: TXLSOutlineStateChange;
end;

TXLSOutlineGeometry = class
  constructor Create(AAxis: TXLSOutlineAxis;
    ASummaryAfter: Boolean);
  procedure Clear;
  property Axis: TXLSOutlineAxis;
  property SpanCount: Integer;
  procedure AddSpan(AFirstIndex, ALastIndex, ALevel: Integer;
    AHidden, ACollapsed: Boolean);
  function TryGetNode(ANodeIndex: Integer;
    out ANode: TXLSOutlineNode): Boolean;
  function TryBuildNodeCollapsePlan(ANodeIndex: Integer;
    ACollapsed: Boolean; AChildMode: TXLSOutlineChildMode;
    APlan: TXLSOutlineMutationPlan): Boolean;
  procedure BuildDisplayLevelPlan(ADisplayLevel: Integer;
    AChildMode: TXLSOutlineChildMode;
    APlan: TXLSOutlineMutationPlan);
end;
Rad- og kolonneindekser er énbaserte, disposisjonsnivåer er ikke-negative, og spenn må legges til i strengt økende, ikke-overlappende rekkefølge
Tilstøtende spenn med identisk nivå, skjult tilstand og kollapset tilstand slås sammen automatisk; utelatte indekser har implisitt nivå null, synlig tilstand og ingen kollapsmarkør
Begge klassene husker sin Axis fra konstruksjonen, Clear tømmer en plan eller geometri for gjenbruk uten å tildele de interne bufferne på nytt, og SpanCount rapporterer hvor mange sammenslåtte spenn geometrien inneholder for øyeblikket

Nodesemantikk

NodeIndexDen fysiske oppsummeringsraden eller -kolonnen som den som kaller, spør om
FirstDetailIndex / LastDetailIndexDet sammenhengende detaljområdet som har dypere nivå enn oppsummeringselementet
SummaryLevelDisposisjonsnivået som er lagret på oppsummeringselementet, eller null når elementet ikke er materialisert
LevelGruppenivået noden representerer, lik SummaryLevel + 1
SummaryHiddenDen skjulte tilstanden som er lagret på oppsummeringselementet
CollapsedDen eksplisitte kollapsmarkøren som er lagret på oppsummeringselementet
SummaryAfterSann når detaljene kommer før oppsummeringselementet, usann når detaljene kommer etter det
Nestede grupper forblir uavhengige fordi hver spørring stopper ved det første tilstøtende spennet som ikke har dypere nivå enn det valgte oppsummeringselementet
Et mellomrom avslutter også detaljområdet, slik at sparsom metadata ikke utilsiktet kan bygge bro over ubrukte koordinater inn i én gruppe

Mutasjonsplaner

En mutasjonsplan inneholder ordnede énbaserte områder og en feltmaske som angir om hvert område endrer skjult tilstand, kollapset tilstand eller begge deler; tilsvarende tilstøtende endringer slås sammen automatisk
xocPreserveEndrer den valgte noden og beholder kollapsmarkørene til underordnede noder, som er standardvirkemåten for nestede grupper
xocCollapseMerker underordnede noder som kollapset når de ligger innenfor den valgte noden eller er skjult under ønsket visningsnivå
xocExpandFjerner kollapsmarkørene til underordnede noder når de ligger innenfor den valgte noden eller er skjult under ønsket visningsnivå
Å utvide en forelder med xocPreserve avdekker direkte detaljer, mens detaljer som tilhører kollapsede underordnede, forblir skjult; å utvide et underordnet element inne i en kollapset forgjenger viser ikke innhold gjennom den forgjengeren
Visningsnivåer er énbaserte: nivå 1 kollapser hver gruppe på toppnivå, og hver høyere verdi avdekker ett ytterligere disposisjonsnivå mens samsvarende grensenodemarkører settes
Å bygge den samme ønskede tilstanden fra en geometri som allerede inneholder den, gir en tom plan, og spørring mot en ikke-node returnerer usann med en tom plan
Nodeoperasjoner lar den uavhengige skjulte tilstanden til det valgte oppsummeringselementet være uendret, og visningsnivåplaner gjør ikke nivå-null-elementer synlige igjen som ble skjult utenfor en disposisjonsgruppe

Regnearkadaptere

function TryGetOutlineNode(AAxis: TXLSOutlineAxis;
  ANodeIndex: Integer; out ANode: TXLSOutlineNode): Boolean;
function SetOutlineNodeCollapsed(AAxis: TXLSOutlineAxis;
  ANodeIndex: Integer; ACollapsed: Boolean;
  AChildMode: TXLSOutlineChildMode = xocPreserve): Boolean;
procedure SetOutlineDisplayLevel(AAxis: TXLSOutlineAxis;
  ADisplayLevel: Integer;
  AChildMode: TXLSOutlineChildMode = xocPreserve);
TXLSWorksheet og TXLSXWorksheet eksponerer de samme tre metodene, slik at den som kaller, kan spørre om eller endre en énbasert rad- eller kolonneoppsummeringsnode uten å bygge geometri manuelt
Den klassiske adapteren leser bare tildelte radblokker og tilordnede kolonnemetadata, mens XLSX-adapteren fletter sine sparsomme lister for disposisjonsnivå, skjult tilstand og kollapset tilstand før én komprimert mutasjonsplan brukes i én enkelt skrivetransaksjon
Rad- og kolonnegrupper i OpenDocument beholder sin opprinnelige nestede table:display-tilstand; direkte metadataredigeringer og strukturelle rad- eller kolonneendringer projiserer denne tilstanden trygt til den logiske oppsummeringsnoden, og konvertering til XLSX skriver kollapsmarkøren på XLSX-oppsummeringselementet i stedet for på hvert gruppemedlem
De eksisterende metodene TXLSXWorksheet.ToggleRowGrouped og ToggleColGrouped forblir tilgjengelige som kompatibilitetsinnpakninger; argumentet deres er den første detaljraden eller -kolonnen, og innpakningen løser den retningsbevisste oppsummeringsnoden før den veksler den

Delphi-eksempel

Geometry := TXLSOutlineGeometry.Create(xoaRows, True);
Plan := TXLSOutlineMutationPlan.Create(xoaRows);
try
  Geometry.AddSpan(2, 4, 1, False, False);
  Geometry.AddSpan(5, 5, 0, False, False);

  if Geometry.TryGetNode(5, Node) then
    UseOutlineNode(Node.FirstDetailIndex,
      Node.LastDetailIndex, Node.Collapsed);

  if Geometry.TryBuildNodeCollapsePlan(5, True,
    xocPreserve, Plan) then
    ApplyOutlineChanges(Plan);
finally
  Plan.Free;
  Geometry.Free;
end;

C++Builder-eksempel

Lxoutline::TXLSOutlineGeometry *geometry =
  new Lxoutline::TXLSOutlineGeometry(Lxoutline::xoaColumns, false);
try {
  geometry->AddSpan(3, 3, 0, false, true);
  geometry->AddSpan(4, 7, 1, true, false);

  Lxoutline::TXLSOutlineNode node;
  if (geometry->TryGetNode(3, node))
    UseOutlineNode(node.FirstDetailIndex, node.LastDetailIndex,
      node.Collapsed);
}
__finally {
  delete geometry;
}

Ytelse og omfang

Nodeoppslag bruker et binærsøk etterfulgt bare av de tilstøtende materialiserte spennene som den valgte gruppen krysser, noe som gir O(log n + k) arbeid for n spenn og k besøkte spenn
Mutasjonsplanlegging i bulk finner hver materialisert node med ett lineært gjennomløp med monotonisk stakk, fletter kollapsede synlighetsintervaller og sender ut komprimerte områdeendringer uten å besøke ubrukte koordinater
Byggeren godtar den siste XLSX-regnearkraden mens bare de oppgitte spennene beholdes, så en høy koordinat innebærer ingen tildeling eller gjennomsøking av en million oppføringer
Regresjonsporten for regnearkadapteren kjører de samme 32,768 nodeforespørslene og 2,048 kollaps- eller utvidelsesmutasjoner over seks materialiserte radoppføringer nær rad 8 og rad 1,048,576, krever null cellematerialisering og setter kostnaden ved høye koordinater i forhold til referansegrunnlinjen med lave koordinater
TXLSOutlineGeometry skriver aldri arbeidsbokdata direkte; motoradaptere validerer og bruker den returnerte planen, slik at geometrianalyse og tilstandsmutasjon forblir adskilt

Se også

Ytterligere klassiske XLS API-medlemmer
Avanserte XLSX-API-medlemmer
Ytterligere bibliotek-API-medlemmer