Documentação do HotXLS

Geometria de estrutura de tópicos esparsa

A unidade lxOutline fornece geometria neutra de motor e planeamento de mutação para estruturas de tópicos de linhas e colunas
Armazena apenas intervalos materializados, reconhece nós de resumo a partir de transições adjacentes do nível da estrutura de tópicos e cria alterações de estado comprimidas para esquemas com resumo após e resumo antes, sem alocar uma entrada para cada coordenada da folha de cálculo

Tipos principais

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;
Os índices de linhas e colunas têm base um, os níveis da estrutura de tópicos não são negativos e os intervalos têm de ser adicionados por ordem estritamente crescente e sem sobreposições
Intervalos adjacentes com estado idêntico de nível, oculto e recolhido são unidos automaticamente; os índices omitidos têm implicitamente nível zero, estado visível e nenhum marcador de recolha
Ambas as classes memorizam o respetivo Axis na construção, Clear esvazia um plano ou uma geometria para reutilização sem realocar as memórias intermédias internas, e SpanCount informa quantos intervalos unidos a geometria contém atualmente

Semântica de nós

NodeIndexA linha ou coluna de resumo física consultada pelo chamador
FirstDetailIndex / LastDetailIndexO intervalo contíguo de detalhes cujo nível é mais profundo do que o item de resumo
SummaryLevelO nível de estrutura de tópicos armazenado no item de resumo, ou zero quando esse item não está materializado
LevelO nível de grupo representado pelo nó, igual a SummaryLevel + 1
SummaryHiddenO estado oculto armazenado no item de resumo
CollapsedO marcador de recolha explícito armazenado no item de resumo
SummaryAfterTrue quando os detalhes precedem o item de resumo, false quando os detalhes se lhe seguem
Os grupos aninhados permanecem independentes porque cada consulta para no primeiro intervalo adjacente cujo nível não é mais profundo do que o item de resumo selecionado
Uma lacuna também termina o intervalo de detalhes, pelo que metadados esparsos não podem unir acidentalmente coordenadas não utilizadas num só grupo

Planos de mutação

Um plano de mutação contém intervalos ordenados com base um e uma máscara de campos que indica se cada intervalo altera o estado oculto, o estado recolhido ou ambos; as alterações equivalentes adjacentes são unidas automaticamente
xocPreserveAltera o nó selecionado mantendo os marcadores de recolha dos descendentes, que é o comportamento predefinido dos grupos aninhados
xocCollapseMarca os nós descendentes como recolhidos quando estão dentro do nó selecionado ou ocultos abaixo do nível de apresentação pedido
xocExpandLimpa os marcadores de recolha dos descendentes quando estes estão dentro do nó selecionado ou ocultos abaixo do nível de apresentação pedido
Expandir um pai com xocPreserve revela os detalhes imediatos, enquanto os detalhes pertencentes a filhos recolhidos permanecem ocultos; expandir um filho dentro de um antecessor recolhido não expõe o conteúdo através desse antecessor
Os níveis de apresentação têm base um: o nível 1 recolhe todos os grupos de nível superior, e cada valor mais alto revela um nível adicional da estrutura de tópicos, definindo os marcadores correspondentes dos nós de limite
Construir o mesmo estado pedido a partir de uma geometria que já o contém produz um plano vazio, e consultar um não-nó devolve false com um plano vazio
As operações de nós deixam inalterado o estado oculto independente do item de resumo selecionado, e os planos de nível de apresentação não voltam a mostrar itens de nível zero que estavam ocultos fora de um grupo da estrutura de tópicos

Adaptadores de folhas de cálculo

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 expõem os mesmos três métodos, pelo que os chamadores podem consultar ou alterar um nó de resumo de linha ou coluna com base um sem construir a geometria manualmente
O adaptador clássico lê apenas blocos de linhas alocados e metadados de colunas atribuídos, enquanto o adaptador XLSX intercala as suas listas esparsas de nível da estrutura de tópicos, oculto e recolhido, antes de aplicar um plano de mutação comprimido numa única transação de escrita
Os grupos de linhas e colunas do OpenDocument mantêm o seu estado table:display aninhado nativo; as edições diretas de metadados e as alterações estruturais de linhas ou colunas projetam esse estado em segurança para o nó de resumo lógico, e a conversão para XLSX escreve o marcador de recolha no item de resumo XLSX em vez de em cada membro do grupo
Os métodos TXLSXWorksheet.ToggleRowGrouped e ToggleColGrouped existentes permanecem disponíveis como wrappers de compatibilidade; o seu argumento é a primeira linha ou coluna de detalhes, e o wrapper resolve o nó de resumo sensível à direção antes de o alternar

Exemplo em 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;

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

Desempenho e âmbito

A pesquisa de nós utiliza uma pesquisa binária seguida apenas dos intervalos materializados adjacentes cruzados pelo grupo selecionado, resultando num trabalho O(log n + k) para n intervalos e k intervalos visitados
O planeamento de mutações em massa deteta cada nó materializado com uma passagem linear de pilha monótona, intercala intervalos de visibilidade recolhidos e emite alterações de intervalo comprimidas sem visitar coordenadas não utilizadas
O construtor aceita a última linha da folha XLSX retendo apenas os intervalos fornecidos, pelo que uma coordenada elevada não implica uma alocação ou análise de um milhão de entradas
O portão de regressão dos adaptadores de folhas executa as mesmas 32,768 consultas de nós e 2,048 mutações de recolha ou expansão sobre seis entradas de linhas materializadas perto da linha 8 e da linha 1,048,576, exige materialização zero de células e limita o custo das coordenadas elevadas em relação à linha de base de coordenadas baixas
O TXLSOutlineGeometry nunca escreve dados do livro de trabalho diretamente; os adaptadores de motor validam e aplicam o plano devolvido, permitindo que a análise de geometria e a mutação de estado permaneçam separadas

Veja também

Membros adicionais da API XLS clássica
Membros avançados da API XLSX
Membros adicionais da API da biblioteca