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
| NodeIndex | A linha ou coluna de resumo física consultada pelo chamador |
| FirstDetailIndex / LastDetailIndex | O intervalo contíguo de detalhes cujo nível é mais profundo do que o item de resumo |
| SummaryLevel | O nível de estrutura de tópicos armazenado no item de resumo, ou zero quando esse item não está materializado |
| Level | O nível de grupo representado pelo nó, igual a SummaryLevel + 1 |
| SummaryHidden | O estado oculto armazenado no item de resumo |
| Collapsed | O marcador de recolha explícito armazenado no item de resumo |
| SummaryAfter | True 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
| xocPreserve | Altera o nó selecionado mantendo os marcadores de recolha dos descendentes, que é o comportamento predefinido dos grupos aninhados |
| xocCollapse | Marca os nós descendentes como recolhidos quando estão dentro do nó selecionado ou ocultos abaixo do nível de apresentação pedido |
| xocExpand | Limpa 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