Documentazione HotXLS

Geometria di struttura sparsa

L'unità lxOutline fornisce geometria e pianificazione delle mutazioni indipendenti dal motore per le strutture di righe e colonne
Memorizza solo gli intervalli materializzati, riconosce i nodi di riepilogo dalle transizioni adiacenti dei livelli di struttura e crea cambi di stato compressi per i layout riepilogo-dopo e riepilogo-prima senza allocare una voce per ogni coordinata del foglio di lavoro

Tipi principali

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;
Gli indici di righe e colonne sono in base 1, i livelli di struttura sono non negativi e gli intervalli devono essere aggiunti in ordine strettamente crescente e senza sovrapposizioni
Gli intervalli adiacenti con livello, stato nascosto e stato compresso identici vengono accorpati automaticamente; gli indici omessi hanno livello zero implicito, stato visibile e nessun marcatore di compressione
Entrambe le classi ricordano il proprio Axis dalla costruzione, Clear svuota un piano o una geometria per il riutilizzo senza riallocare i buffer interni, e SpanCount riporta quanti intervalli accorpati contiene attualmente la geometria

Semantica dei nodi

NodeIndexLa riga o colonna di riepilogo fisica interrogata dal chiamante
FirstDetailIndex / LastDetailIndexL'intervallo di dettagli contiguo il cui livello è più profondo dell'elemento di riepilogo
SummaryLevelIl livello di struttura memorizzato sull'elemento di riepilogo, oppure zero quando quell'elemento non è materializzato
LevelIl livello di gruppo rappresentato dal nodo, pari a SummaryLevel + 1
SummaryHiddenLo stato nascosto memorizzato sull'elemento di riepilogo
CollapsedIl marcatore di compressione esplicito memorizzato sull'elemento di riepilogo
SummaryAfterTrue quando i dettagli precedono l'elemento di riepilogo, false quando lo seguono
I gruppi annidati restano indipendenti perché ogni interrogazione si ferma al primo intervallo adiacente il cui livello non è più profondo dell'elemento di riepilogo selezionato
Anche un vuoto termina l'intervallo di dettagli, così metadati sparsi non possono collegare accidentalmente coordinate inutilizzate in un unico gruppo

Piani di mutazione

Un piano di mutazione contiene intervalli ordinati in base 1 e una maschera di campi che indica se ciascun intervallo modifica lo stato nascosto, lo stato compresso o entrambi; i cambi equivalenti adiacenti vengono accorpati automaticamente
xocPreserveModifica il nodo selezionato conservando i marcatori di compressione dei discendenti, che è il comportamento predefinito per i gruppi annidati
xocCollapseContrassegna come compressi i nodi discendenti che si trovano all'interno del nodo selezionato o che sono nascosti sotto il livello di visualizzazione richiesto
xocExpandRimuove i marcatori di compressione dei nodi discendenti che si trovano all'interno del nodo selezionato o che sono nascosti sotto il livello di visualizzazione richiesto
Espandere un genitore con xocPreserve rivela i dettagli immediati mentre i dettagli appartenenti a figli compressi restano nascosti; espandere un figlio all'interno di un antenato compresso non espone il contenuto attraverso quell'antenato
I livelli di visualizzazione sono in base 1: il livello 1 comprime ogni gruppo di primo livello e ogni valore superiore rivela un ulteriore livello di struttura impostando i marcatori dei nodi di confine corrispondenti
Costruire lo stesso stato richiesto a partire da una geometria che lo contiene già produce un piano vuoto, e interrogare un non-nodo restituisce false con un piano vuoto
Le operazioni sui nodi lasciano invariato lo stato nascosto indipendente dell'elemento di riepilogo selezionato, e i piani di livello di visualizzazione non rendono visibili gli elementi di livello zero nascosti al di fuori di un gruppo di struttura

Adattatori del foglio di lavoro

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 e TXLSXWorksheet espongono gli stessi tre metodi, così i chiamanti possono interrogare o modificare un nodo di riepilogo di riga o colonna in base 1 senza costruire la geometria manualmente
L'adattatore classico legge solo i blocchi di righe allocati e i metadati delle colonne assegnate, mentre l'adattatore XLSX unisce i propri elenchi sparsi di livelli di struttura, stati nascosti e compressioni prima di applicare un unico piano di mutazione compresso in una singola transazione di scrittura
I gruppi di righe e colonne OpenDocument conservano il loro stato nativo annidato table:display; le modifiche dirette dei metadati e i cambi strutturali di righe o colonne proiettano tale stato in sicurezza sul nodo di riepilogo logico, e la conversione in XLSX scrive il marcatore di compressione sull'elemento di riepilogo XLSX invece che su ogni membro del gruppo
I metodi esistenti TXLSXWorksheet.ToggleRowGrouped e ToggleColGrouped restano disponibili come wrapper di compatibilità; il loro argomento è la prima riga o colonna di dettagli, e il wrapper risolve il nodo di riepilogo consapevole della direzione prima di commutarlo

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

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

Prestazioni e ambito

La ricerca dei nodi usa una ricerca binaria seguita solo dagli intervalli materializzati adiacenti attraversati dal gruppo selezionato, per un lavoro di O(log n + k) con n intervalli e k intervalli visitati
La pianificazione delle mutazioni in blocco scopre ogni nodo materializzato con un passaggio lineare a pila monotona, unisce gli intervalli di visibilità compressa ed emette cambi di intervallo compressi senza visitare le coordinate inutilizzate
Il builder accetta l'ultima riga del foglio di lavoro XLSX conservando solo gli intervalli forniti, così una coordinata elevata non implica un'allocazione o una scansione di un milione di voci
Il gate di regressione degli adattatori del foglio di lavoro esegue le stesse 32,768 interrogazioni di nodi e 2,048 mutazioni di compressione o espansione su sei voci di righe materializzate vicino alla riga 8 e alla riga 1,048,576, richiede zero materializzazione di celle e delimita il costo delle coordinate elevate rispetto alla baseline a basse coordinate
TXLSOutlineGeometry non scrive mai direttamente i dati del workbook; gli adattatori del motore validano e applicano il piano restituito, mantenendo separate l'analisi della geometria e la mutazione dello stato

Vedere anche

Membri API aggiuntivi XLS classici
Membri avanzati dell'API XLSX
Membri API aggiuntivi della libreria