HotXLS-dokumentation

Sparsom dispositiongeometri

Enheden lxOutline leverer motornøutral geometri og mutationsplanlægning for række- og kolonnedispositioner
Den gemmer kun materialiserede intervaller, genkender oversigtsknuder ud fra tilstødende dispositionsniveauovergange og skaber komprimerede tilstandsændringer til layout med oversigt-efter og oversigt-før uden at allokere en post for hver regnearkskoordinat

Kernetyper

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;
Række- og kolonneindeks er 1-baserede, dispositionsniveauer er ikke-negative, og intervaller skal tilføjes i strengt stigende, ikke-overlappende rækkefølge
Tilstødende intervaller med identisk niveau, skjult tilstand og sammenfoldet tilstand flettes automatisk; udeladte indeks har implicit niveau nul, synlig tilstand og intet sammenfoldelsesmærke
Begge klasser husker deres Axis fra konstruktionen, Clear tømmer en plan eller geometri til genbrug uden at reallokere de interne buffere, og SpanCount rapporterer, hvor mange flettede intervaller geometrien i øjeblikket indeholder

Knudesemantik

NodeIndexDen fysiske oversigtsrække eller -kolonne, som kalderen forespørger
FirstDetailIndex / LastDetailIndexDet sammenhængende detaljeområde, hvis niveau er dybere end oversigtselementet
SummaryLevelDet dispositionsniveau, der er gemt på oversigtselementet, eller nul, når det element ikke er materialiseret
LevelDet gruppeniveau, som knuden repræsenterer, lig med SummaryLevel + 1
SummaryHiddenDen skjulte tilstand, der er gemt på oversigtselementet
CollapsedDet eksplicitte sammenfoldelsesmærke, der er gemt på oversigtselementet
SummaryAfterTrue, når detaljer går forud for oversigtselementet, false når detaljer følger det
Indlejrede grupper forbliver uafhængige, fordi hver forespørgsel standser ved det første tilstødende interval, hvis niveau ikke er dybere end det valgte oversigtselement
Et hul afslutter også detaljeområdet, så sparsomme metadata ikke ved et uheld kan bygge bro over uanvendte koordinater til én gruppe

Mutationsplaner

En mutationsplan indeholder ordnede 1-baserede områder og en feltmaske, der angiver, om hvert område ændrer skjult tilstand, sammenfoldet tilstand eller begge; tilstødende ækvivalente ændringer flettes automatisk
xocPreserveÆndrer den valgte knude, mens underordnedes sammenfoldelsesmærker bevares, hvilket er standardadfærden for indlejrede grupper
xocCollapseMarkerer underordnede knuder sammenfoldet, når de er inden for den valgte knude eller skjult under det ønskede visningsniveau
xocExpandRydder underordnede knuders sammenfoldelsesmærker, når de er inden for den valgte knude eller skjult under det ønskede visningsniveau
Udvidelse af en overordnet med xocPreserve afslører umiddelbare detaljer, mens detaljer, der tilhører sammenfoldede underordnede, forbliver skjulte; udvidelse af et underordnet inde i en sammenfoldet forfader eksponerer ikke indhold gennem den forfader
Visningsniveauer er 1-baserede: niveau 1 folder hver gruppe på øverste niveau sammen, og hver højere værdi afslører ét yderligere dispositionsniveau, samtidig med at de matchende grænseknude-mærker sættes
Opbygning af den samme ønskede tilstand ud fra geometri, der allerede indeholder den, giver en tom plan, og forespørgsel af en ikke-knude returnerer false med en tom plan
Knudeoperationer efterlader det valgte oversigtselements uafhængige skjulte tilstand uændret, og planer for visningsniveauer gør ikke niveau-nul-elementer synlige, der blev skjult uden for en dispositionsgruppe

Regnearksadaptere

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 metoder, så kalderen kan forespørge eller ændre en 1-baseret række- eller kolonneoversigtsknude uden at bygge geometrien manuelt
Den klassiske adapter læser kun allokerede rækkeblokke og tildelte kolonnemetadata, mens XLSX-adapteren fletter sine sparsomme lister over dispositionsniveau, skjult tilstand og sammenfoldning, inden én komprimeret mutationsplan anvendes i en enkelt skrivetransaktion
OpenDocument række- og kolonnegrupper bevarer deres oprindelige indlejrede table:display-tilstand; direkte metadataredigeringer og strukturelle række- eller kolonneændringer projicerer sikkert den tilstand til den logiske oversigtsknude, og konvertering til XLSX skriver sammenfoldelsesmærket på XLSX-oversigtselementet frem for på hvert gruppemedlem
De eksisterende TXLSXWorksheet.ToggleRowGrouped- og ToggleColGrouped-metoder forbliver tilgængelige som kompatibilitetswrappere; deres argument er den første detaljerække eller -kolonne, og wrapperen opløser den retningsbevidste oversigtsknude, før den skiftes

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

Ydelse og omfang

Knudeopslag bruger binær søgning efterfulgt kun af de tilstødende materialiserede intervaller, som den valgte gruppe krydser, hvilket giver O(log n + k) arbejde for n intervaller og k besøgte intervaller
Planlægning af bulk-mutationer opdager hver materialiseret knude med et lineært gennemløb med en monoton stak, fletter sammenfoldede synlighedsintervaller og udsender komprimerede områdeændringer uden at besøge uanvendte koordinater
Byggeren accepterer den sidste XLSX-regnearksrække, mens den kun fastholder de angivne intervaller, så en høj koordinat ikke indebærer en allokering eller scanning af en million poster
Regnearksadapterens regressionsgate udfører de samme 32.768 knudeforespørgsler og 2.048 sammenfold- eller udvid-mutationer over seks materialiserede rækkeposter nær række 8 og række 1.048.576, kræver nul cellematerialisering og afgrænser omkostningen ved høj koordinat mod basislinjen med lav koordinat
TXLSOutlineGeometry skriver aldrig projektmappedata direkte; motoradaptere validerer og anvender den returnerede plan, så geometrianalyse og tilstandsmutation forbliver adskilt

Se også

Yderligere klassiske XLS-API-medlemmer
Avancerede XLSX-API-medlemmer
Yderligere biblioteks-API-medlemmer