Dokumentácia HotXLS

Riedka geometria osnovy

Jednotka lxOutline poskytuje geometriu a plánovanie mutácií nezávislé od enginu pre osnovy riadkov a stĺpcov
Ukladá len materializované úseky, rozpoznáva súhrnné uzly z priľahlých prechodov úrovní osnovy a vytvára komprimované zmeny stavu pre rozloženia so súhrnom za a pred detailmi bez alokácie položky pre každú súradnicu hárku

Základné typy

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;
Indexy riadkov a stĺpcov sú indexované od jednotky, úrovne osnovy sú nezáporné a úseky sa musia pridávať v prísne rastúcom neprekrývajúcom sa poradí
Priľahlé úseky s rovnakou úrovňou, skrytým a zbaleným stavom sa automaticky spájajú; vynechané indexy majú implicitnú úroveň nula, viditeľný stav a žiadnu značku zbalenia
Obe triedy si pamätajú svoju Axis z konštrukcie, Clear vyprázdní plán alebo geometriu na opätovné použitie bez realokácie interných bufferov a SpanCount hlási, koľko spojených úsekov geometria aktuálne drží

Sémantika uzlov

NodeIndexFyzický súhrnný riadok alebo stĺpec dotazovaný volajúcim
FirstDetailIndex / LastDetailIndexSúvislý rozsah detailov, ktorého úroveň je hlbšia ako úroveň súhrnnej položky
SummaryLevelÚroveň osnovy uložená na súhrnnej položke, alebo nula, keď táto položka nie je materializovaná
LevelÚroveň skupiny reprezentovaná uzlom, rovná SummaryLevel + 1
SummaryHiddenSkrytý stav uložený na súhrnnej položke
CollapsedExplicitná značka zbalenia uložená na súhrnnej položke
SummaryAfterTrue, keď detaily predchádzajú súhrnnej položke, false, keď ju nasledujú
Vnorené skupiny ostanú nezávislé, pretože každý dotaz končí pri prvom priľahlom úseku, ktorého úroveň nie je hlbšia ako úroveň vybranej súhrnnej položky
Medzera tiež ukončuje rozsah detailov, takže riedke metadáta nemôžu náhodne premostiť nepoužívané súradnice do jednej skupiny

Plány mutácií

Plán mutácie obsahuje usporiadané rozsahy indexované od jednotky a masku polí udávajúcu, či každý rozsah mení skrytý stav, zbalený stav alebo oboje; priľahlé ekvivalentné zmeny sa automaticky spájajú
xocPreserveMení vybraný uzol pri zachovaní značiek zbalenia potomkov, čo je predvolené správanie pre vnorené skupiny
xocCollapseOznačí uzly potomkov ako zbalené, keď sú vo vnútri vybraného uzla alebo skryté pod požadovanou zobrazovacou úrovňou
xocExpandZruší značky zbalenia potomkov, keď sú vo vnútri vybraného uzla alebo skryté pod požadovanou zobrazovacou úrovňou
Rozbalenie rodiča s xocPreserve odhalí bezprostredné detaily, zatiaľ čo detaily patriace zbaleným potomkom ostanú skryté; rozbalenie potomka vo vnútri zbaleného predka neodhalí obsah cez tohto predka
Zobrazovacie úrovne sú indexované od jednotky: úroveň 1 zbalí každú skupinu najvyššej úrovne a každá vyššia hodnota odhalí jednu ďalšiu úroveň osnovy, pritom nastavuje zodpovedajúce značky okrajových uzlov
Zostavenie rovnakého požadovaného stavu z geometrie, ktorá ho už obsahuje, vytvorí prázdny plán a dotaz na nieuzol vráti false s prázdnym plánom
Operácie uzlov ponechávajú nezávislý skrytý stav vybranej súhrnnej položky bez zmeny a plány zobrazovacích úrovní znovu nezobrazia položky úrovne nula, ktoré boli skryté mimo skupiny osnovy

Adaptéry hárkov

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 a TXLSXWorksheet sprístupňujú tie isté tri metódy, takže volajúci môžu dotazovať alebo meniť súhrnný uzol riadku či stĺpca indexovaný od jednotky bez ručného zostavovania geometrie
Klasický adaptér číta len alokované bloky riadkov a priradené metadáta stĺpcov, zatiaľ čo adaptér XLSX zlúči svoje riedke zoznamy úrovní osnovy, skrytého a zbaleného stavu skôr, než aplikuje jeden komprimovaný plán mutácie v jednej zapisovacej transakcii
Skupiny riadkov a stĺpcov OpenDocument si uchovávajú svoj natívny vnorený stav table:display; priame úpravy metadát a štrukturálne zmeny riadkov či stĺpcov bezpečne premietnu tento stav do logického súhrnného uzla a konverzia do XLSX zapíše značku zbalenia na súhrnnú položku XLSX namiesto každého člena skupiny
Existujúce metódy TXLSXWorksheet.ToggleRowGrouped a ToggleColGrouped ostanú k dispozícii ako kompatibilné obálky; ich argumentom je prvý riadok alebo stĺpec detailov a obálka rozpozná uzol súhrnu s ohľadom na smer skôr, než ho prepne

Príklad pre 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;

Príklad pre 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;
}

Výkon a rozsah

Vyhľadanie uzla používa binárne vyhľadávanie nasledované len priľahlými materializovanými úsekmi, ktoré vybraná skupina pretína, čo dáva prácu O(log n + k) pre n úsekov a k navštívených úsekov
Hromadné plánovanie mutácií objaví každý materializovaný uzol lineárnym priechodom monotonného zásobníka, zlúči intervaly viditeľnosti zbalenia a vysielá komprimované zmeny rozsahov bez návštevy nepoužívaných súradníc
Zostavovač prijíma posledný riadok hárku XLSX, pritom uchováva len dodané úseky, takže vysoká súradnica neimplikuje alokáciu ani prehľadanie milióna položiek
Regresná brána adaptéra hárkov spúšťa tie istých 32,768 dotazov na uzly a 2,048 mutácií zbalenia alebo rozbalenia nad šiestimi materializovanými položkami riadkov blízko riadku 8 a riadku 1,048,576, vyžaduje nulovú materializáciu buniek a obmedzuje náklady vysokých súradníc voči základnej línii nízkych súradníc
TXLSOutlineGeometry nikdy nezapisuje priamo dáta zošita; adaptéry enginov vrátený plán validujú a aplikujú, takže analýza geometrie a mutácia stavu ostanú oddelené

Pozri tiež

Ďalší členovia klasického XLS API
Pokročilé členy API XLSX
Ďalšie členy knižničného API