Jedinica lxOutline pruža geometriju i planiranje mutacija neovisne o mehanizmu za konture po retcima i stupcima
Sprema samo materijalizirane raspone, prepoznaje sažete čvorove iz susjednih prijelaza razine konture i stvara komprimirane promjene stanja za raspored sažetka iza i sažetka ispred bez alociranja zapisa za svaku koordinatu radnog lista
Osnovni tipovi
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;
Indeksi redaka i stupaca broje od jedan, razine konture nisu negativne, a rasponi se moraju dodavati u strogo rastućem redoslijedu bez preklapanja
Susjedni rasponi s istom razinom te jednakim skrivenim stanjem i stanjem sažimanja spajaju se automatski; izostavljeni indeksi imaju neizravnu razinu nula, vidljivo stanje i bez oznake sažimanja
Obje klase pamte svoj Axis iz konstrukcije, Clear ispražnjuje plan ili geometriju za ponovnu upotrebu bez ponovne alokacije unutarnjih međuspremnika, a SpanCount izvještava koliko spojenih raspona geometrija trenutačno drži
Semantika čvorova
| NodeIndex | Fizički sažeti redak ili stupac koji je izupitao pozivatelj |
| FirstDetailIndex / LastDetailIndex | Neprekinuti raspon pojedinosti čija je razina dublja od razine sažete stavke |
| SummaryLevel | Razina konture spremljena na sažetoj stavci, ili nula kada ta stavka nije materijalizirana |
| Level | Razina grupe koju čvor predstavlja, jednaka SummaryLevel + 1 |
| SummaryHidden | Skriveno stanje spremljeno na sažetoj stavci |
| Collapsed | Izričita oznaka sažimanja spremljena na sažetoj stavci |
| SummaryAfter | True kada pojedinosti prethode sažetoj stavci, false kada pojedinosti slijede nakon nje |
Ugniježđene grupe ostaju neovisne jer svaki upit staje kod prvog susjednog raspona čija razina nije dublja od razine odabrane sažete stavke
I praznina prekida raspon pojedinosti, pa razrjeđeni metapodaci ne mogu slučajno mostiti nekorištene koordinate u jednu grupu
Planovi mutacija
Plan mutacija sadrži poredane raspone koji broje od jedan i masku polja koja označava mijenja li svaki raspon skriveno stanje, stanje sažimanja ili oboje; susjedne ekvivalentne promjene spajaju se automatski
| xocPreserve | Mijenja odabrani čvor uz zadržavanje oznaka sažimanja potomaka, što je standardno ponašanje ugniježđenih grupa |
| xocCollapse | Označava potomke sažetima kada su unutar odabranog čvora ili skriveni ispod zatražene razine prikaza |
| xocExpand | Briše oznake sažimanja potomaka kada su unutar odabranog čvora ili skriveni ispod zatražene razine prikaza |
Proširivanje roditelja s xocPreserve otkriva neposredne pojedinosti dok pojedinosti koje pripadaju sažetim potomcima ostaju skrivene; proširivanje potomka unutar sažetog pretka ne razotkriva sadržaj kroz tog pretka
Razine prikaza broje od jedan: razina 1 sažima svaku grupu najviše razine, a svaka viša vrijednost otkriva jednu dodatnu razinu konture uz postavljanje odgovarajućih oznaka graničnih čvorova
Izgradnja istog zatraženog stanja iz geometrije koje ga već sadrži daje prazan plan, a upit na mjesto koje nije čvor vraća false s praznim planom
Operacije nad čvorovima ostavljaju neovisno skriveno stanje odabrane sažete stavke nepromijenjenim, a planovi razine prikaza ne otkrivaju stavke razine nula skrivene izvan grupe konture
Prilagodnici radnog lista
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 i TXLSXWorksheet izlažu iste tri metode, pa pozivatelj može upititi ili promijeniti sažeti čvor retka ili stupca koji broji od jedan bez ručne izgradnje geometrije
Klasični prilagodnik čita samo alocirane blokove redaka i dodijeljene metapodatke stupaca, dok XLSX prilagodnik spaja svoje razrjeđene popise razine konture, skrivenog i sažetog stanja prije primjene jednog komprimiranog plana mutacije u jednoj upisnoj transakciji
Grupe redaka i stupaca u OpenDocumentu zadržavaju svoje izvorno ugniježđeno stanje table:display; izravne izmjene metapodataka i strukturne promjene redaka ili stupaca sigurno projiciraju to stanje na logički sažeti čvor, a pretvorba u XLSX zapisuje oznaku sažimanja na XLSX sažetoj stavci umjesto na svakom članu grupe
Postojeće metode TXLSXWorksheet.ToggleRowGrouped i ToggleColGrouped ostaju dostupne kao omotnice za usklađenost; njihov je argument prvi redak ili stupac pojedinosti, a omotnica razrješava čvor sažetka osjetljiv na smjer prije njegova prebacivanja
Primjer za Delphi
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;
Primjer za C++Builder
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;
}
Učinkovitost i opseg
Pretraživanje čvora upotrebljava binarno pretraživanje nakon kojega slijede samo susjedni materializirani rasponi koje presjeca odabrana grupa, čime se postiže rad od O(log n + k) za n raspona i k posjećenih raspona
Planiranje grupnih mutacija otkriva svaki materijalizirani čvor linearnim prolazom monotonskog stoga, spaja intervale sažete vidljivosti i ispušta komprimirane promjene po rasponima bez posjećivanja nekorištenih koordinata
Graditelj prima posljednji redak XLSX radnog lista uz zadržavanje samo predanih raspona, pa visoka koordinata ne podrazumijeva alokaciju ni skeniranje milijun zapisa
Regresijska granica prilagodnika radnog lista izvodi istih 32,768 upita na čvorove i 2,048 mutacija sažimanja ili proširivanja nad šest materijaliziranih zapisa redaka blizu retka 8 i retka 1,048,576, zahtijeva nulu materijalizacija ćelija i ograničava trošak visokih koordinata u odnosu na polaznu mjeru pri niskim koordinatama
TXLSOutlineGeometry nikada ne upisuje izravno podatke radne knjige; prilagodnici mehanizma provjeravaju i primjenjuju vraćeni plan, omogućujući da analiza geometrije i promjena stanja ostanu odvojene
Vidi također