HotXLS-documentatie

Sparse-outlinegeometrie

De unit lxOutline biedt engineneutrale geometrie en mutatieplanning voor rij- en kolomoutlines
Ze slaat alleen gematerialiseerde segmenten op, herkent samenvattingsknooppunten aan aangrenzende overgangen van het outlineniveau en maakt gecomprimeerde statuswijzigingen aan voor samenvatting-na- en samenvatting-voor-lay-outs, zonder voor elke werkbladcoördinaat een item toe te wijzen

Kerntypes

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;
Rij- en kolomindices hebben basis 1, outlineniveaus zijn niet-negatief, en segmenten moeten in streng oplopende, niet-overlappende volgorde worden toegevoegd
Aangrenzende segmenten met identieke level-, hidden- en collapsed-status worden automatisch samengevoegd; weggelaten indices hebben impliciet niveau nul, zichtbare status en geen samenvouwmarkering
Beide klassen onthouden hun Axis vanaf de constructie, Clear maakt een plan of geometrie leeg voor hergebruik zonder de interne buffers opnieuw toe te wijzen, en SpanCount meldt hoeveel samengevoegde segmenten de geometrie momenteel bevat

Knooppuntsemantiek

NodeIndexDe fysieke samenvattingsrij of -kolom die de aanroeper raadpleegt
FirstDetailIndex / LastDetailIndexHet aaneengesloten detailbereik waarvan het niveau dieper is dan het samenvattingsitem
SummaryLevelHet outlineniveau dat op het samenvattingsitem is opgeslagen, of nul wanneer dat item niet is gematerialiseerd
LevelHet groepsniveau dat het knooppunt vertegenwoordigt, gelijk aan SummaryLevel + 1
SummaryHiddenDe hidden-status die op het samenvattingsitem is opgeslagen
CollapsedDe expliciete samenvouwmarkering die op het samenvattingsitem is opgeslagen
SummaryAfterTrue wanneer de details vóór het samenvattingsitem liggen, false wanneer ze erop volgen
Geneste groepen blijven onafhankelijk omdat elke query stopt bij het eerste aangrenzende segment waarvan het niveau niet dieper is dan het gekozen samenvattingsitem
Een tussenruimte beëindigt ook het detailbereik, zodat sparse metadata ongebruikte coördinaten niet per ongeluk in één groep kan overbruggen

Mutatieplannen

Een mutatieplan bevat geordende bereiken met basis 1 en een veldmasker dat aangeeft of elk bereik de hidden-status, de collapsed-status of beide wijzigt; aangrenzende gelijkwaardige wijzigingen worden automatisch samengevoegd
xocPreserveWijzigt het gekozen knooppunt en behoudt daarbij de samenvouwmarkeringen van afstammelingen, wat het standaardgedrag voor geneste groepen is
xocCollapseMarkeert afstammingsknooppunten als samengevouwen wanneer ze binnen het gekozen knooppunt liggen of verborgen zijn onder het gevraagde weergaveniveau
xocExpandWist de samenvouwmarkeringen van afstammingsknooppunten wanneer ze binnen het gekozen knooppunt liggen of verborgen zijn onder het gevraagde weergaveniveau
Het uitklappen van een bovenliggend item met xocPreserve toont directe details, terwijl details die bij samengevouwen kinderen horen verborgen blijven; het uitklappen van een kind binnen een samengevouwen voorouder legt geen inhoud bloot via die voorouder
Weergaveniveaus hebben basis 1: niveau 1 vouwt elke groep op het hoogste niveau samen, en elke hogere waarde legt één extra outlineniveau bloot terwijl de bijpassende grensknooppuntmarkeringen worden gezet
Het opbouwen van een al aanwezige gevraagde status vanuit de geometrie levert een leeg plan op, en het raadplegen van een niet-knooppunt geeft false terug met een leeg plan
Knooppuntbewerkingen laten de onafhankelijke hidden-status van het gekozen samenvattingsitem onveranderd, en weergaveniveauplannen maken items op niveau nul die buiten een outlinegroep verborgen waren niet weer zichtbaar

Werkbladadapters

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 en TXLSXWorksheet leggen dezelfde drie methoden bloot, zodat aanroepers een samenvattingsknooppunt van een rij of kolom met basis 1 kunnen raadplegen of wijzigen zonder de geometrie handmatig op te bouwen
De klassieke adapter leest alleen toegewezen rijblokken en toegewezen kolommetadata, terwijl de XLSX-adapter zijn sparse lijsten voor outlineniveau, hidden en collapsed samenvoegt voordat hij één gecomprimeerd mutatieplan toepast in een enkele schrijftransactie
OpenDocument-rij- en kolomgroepen behouden hun native geneste table:display-status; directe metadatawijzigingen en structurele rij- of kolomwijzigingen projecteren die status veilig naar het logische samenvattingsknooppunt, en conversie naar XLSX schrijft de samenvouwmarkering op het XLSX-samenvattingsitem in plaats van op elk groepslid
De bestaande methoden TXLSXWorksheet.ToggleRowGrouped en ToggleColGrouped blijven beschikbaar als compatibiliteitswrappers; hun argument is de eerste detailrij of -kolom, en de wrapper lost het richtingsgevoelige samenvattingsknooppunt op voordat hij het omschakelt

Delphi-voorbeeld

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-voorbeeld

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;
}

Prestaties en reikwijdte

Knooppuntopzoeking gebruikt een binaire zoekactie gevolgd door alleen de aangrenzende gematerialiseerde segmenten die de gekozen groep kruist, en levert daarmee O(log n + k) werk voor n segmenten en k bezochte segmenten
Bulkmutatieplanning vindt elk gematerialiseerd knooppunt met een lineaire ronde over een monotone stapel, voegt samengevouwen zichtbaarheidsintervallen samen en geeft gecomprimeerde bereikwijzigingen door zonder ongebruikte coördinaten te bezoeken
De builder accepteert de laatste XLSX-werkbladrij terwijl hij alleen de geleverde segmenten vasthoudt, zodat een hoge coördinaat geen toewijzing of scan van een miljoen items impliceert
De regressiepoort van de werkbladadapters voert dezelfde 32.768 knooppuntquery's en 2.048 samenvouw- of uitklapmutaties uit over zes gematerialiseerde rijitems nabij rij 8 en rij 1.048.576, vereist nul celmaterialisatie en begrenst de kosten van hoge coördinaten tegen de basislijn van lage coördinaten
TXLSOutlineGeometry schrijft nooit rechtstreeks werkmapgegevens; engineadapters valideren het teruggegeven plan en passen het toe, zodat geometrieanalyse en statusmutatie gescheiden blijven

Zie ook

Extra klassieke XLS-API-leden
Geavanceerde XLSX-API-leden
Extra bibliotheek-API-leden