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
| NodeIndex | Den fysiske oppsummeringsraden eller -kolonnen som den som kaller, spør om |
| FirstDetailIndex / LastDetailIndex | Det sammenhengende detaljområdet som har dypere nivå enn oppsummeringselementet |
| SummaryLevel | Disposisjonsnivået som er lagret på oppsummeringselementet, eller null når elementet ikke er materialisert |
| Level | Gruppenivået noden representerer, lik SummaryLevel + 1 |
| SummaryHidden | Den skjulte tilstanden som er lagret på oppsummeringselementet |
| Collapsed | Den eksplisitte kollapsmarkøren som er lagret på oppsummeringselementet |
| SummaryAfter | Sann 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
| xocPreserve | Endrer den valgte noden og beholder kollapsmarkørene til underordnede noder, som er standardvirkemåten for nestede grupper |
| xocCollapse | Merker underordnede noder som kollapset når de ligger innenfor den valgte noden eller er skjult under ønsket visningsnivå |
| xocExpand | Fjerner 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å