La unidad lxOutline proporciona geometría y planeación de mutaciones independiente del motor para esquemas de filas y columnas
Solo almacena los tramos materializados, reconoce los nodos de resumen a partir de transiciones adyacentes de nivel de esquema y crea cambios de estado comprimidos para los diseños de resumen posterior y resumen anterior sin asignar una entrada por cada coordenada de la hoja de cálculo
Tipos principales
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;
Los índices de filas y columnas están basados en uno, los niveles de esquema son no negativos y los tramos deben agregarse en orden estrictamente creciente y sin superposiciones
Los tramos adyacentes con nivel, estado oculto y estado contraído idénticos se combinan automáticamente; los índices omitidos tienen nivel cero implícito, estado visible y ninguna marca de contracción
Ambas clases recuerdan su Axis desde la construcción, Clear vacía un plan o una geometría para reutilizarlos sin reasignar los búferes internos, y SpanCount reporta cuántos tramos combinados contiene actualmente la geometría
Semántica de los nodos
| NodeIndex | La fila o columna de resumen física consultada por el llamador |
| FirstDetailIndex / LastDetailIndex | El intervalo de detalle contiguo cuyo nivel es más profundo que el elemento de resumen |
| SummaryLevel | El nivel de esquema almacenado en el elemento de resumen, o cero cuando ese elemento no está materializado |
| Level | El nivel de grupo representado por el nodo, igual a SummaryLevel + 1 |
| SummaryHidden | El estado oculto almacenado en el elemento de resumen |
| Collapsed | La marca de contracción explícita almacenada en el elemento de resumen |
| SummaryAfter | True cuando los detalles preceden al elemento de resumen, false cuando los siguen |
Los grupos anidados permanecen independientes porque cada consulta se detiene en el primer tramo adyacente cuyo nivel no es más profundo que el elemento de resumen seleccionado
Un hueco también termina el intervalo de detalle, de modo que los metadatos dispersos no pueden unir accidentalmente coordenadas sin usar en un solo grupo
Planes de mutación
Un plan de mutación contiene intervalos ordenados basados en uno y una máscara de campos que indica si cada intervalo cambia el estado oculto, el estado contraído o ambos; los cambios equivalentes adyacentes se combinan automáticamente
| xocPreserve | Cambia el nodo seleccionado conservando las marcas de contracción de los descendientes, que es el comportamiento predeterminado con grupos anidados |
| xocCollapse | Marca como contraídos los nodos descendientes que están dentro del nodo seleccionado u ocultos por debajo del nivel de presentación solicitado |
| xocExpand | Borra las marcas de contracción de los nodos descendientes que están dentro del nodo seleccionado u ocultos por debajo del nivel de presentación solicitado |
Expandir un elemento primario con xocPreserve muestra los detalles inmediatos mientras que los detalles pertenecientes a elementos secundarios contraídos permanecen ocultos; expandir un elemento secundario dentro de un antecesor contraído no expone contenido a través de ese antecesor
Los niveles de presentación están basados en uno: el nivel 1 contrae todos los grupos de nivel superior y cada valor mayor revela un nivel de esquema adicional, mientras establece las marcas correspondientes en los nodos de límite
Construir el mismo estado solicitado a partir de una geometría que ya lo contiene genera un plan vacío, y consultar un elemento que no es un nodo devuelve false con un plan vacío
Las operaciones de nodo dejan sin cambios el estado oculto independiente del elemento de resumen seleccionado, y los planes de nivel de presentación no hacen visibles los elementos de nivel cero que estaban ocultos fuera de un grupo de esquema
Adaptadores de hoja 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 y TXLSXWorksheet exponen los mismos tres métodos, de modo que los llamadores pueden consultar o cambiar un nodo de resumen de fila o columna basado en uno sin construir la geometría manualmente
El adaptador clásico lee únicamente los bloques de filas asignados y los metadatos de columnas asignados, mientras que el adaptador XLSX combina sus listas dispersas de nivel de esquema, oculto y contraído antes de aplicar un plan de mutación comprimido en una sola transacción de escritura
Los grupos de filas y columnas de OpenDocument conservan su estado nativo anidado table:display; las ediciones directas de metadatos y los cambios estructurales de filas o columnas proyectan ese estado de forma segura en el nodo de resumen lógico, y la conversión a XLSX escribe la marca de contracción en el elemento de resumen XLSX en lugar de en cada miembro del grupo
Los métodos existentes TXLSXWorksheet.ToggleRowGrouped y ToggleColGrouped siguen disponibles como contenedores de compatibilidad; su argumento es la primera fila o columna de detalle, y el contenedor resuelve el nodo de resumen según la dirección antes de alternarlo
Ejemplo de 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;
Ejemplo de 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;
}
Rendimiento y alcance
La búsqueda de nodos usa una búsqueda binaria seguida únicamente de los tramos materializados adyacentes que cruza el grupo seleccionado, lo que supone un trabajo de O(log n + k) para n tramos y k tramos visitados
La planeación de mutaciones en bloque detecta todos los nodos materializados con una pasada lineal de pila monótona, combina los intervalos de visibilidad contraídos y emite cambios de rango comprimidos sin visitar coordenadas sin usar
El constructor acepta la última fila de la hoja de cálculo XLSX reteniendo solo los tramos suministrados, de modo que una coordenada alta no implica una asignación ni un rastreo de un millón de entradas
La puerta de regresión del adaptador de hoja de cálculo ejecuta las mismas 32,768 consultas de nodos y 2,048 mutaciones de contracción o expansión sobre seis entradas de filas materializadas cerca de la fila 8 y de la fila 1,048,576, requiere cero materialización de celdas y acota el costo de coordenadas altas frente a la línea base de coordenadas bajas
TXLSOutlineGeometry nunca escribe datos del libro de trabajo directamente; los adaptadores de motor validan y aplican el plan devuelto, lo que permite mantener separados el análisis de geometría y la mutación de estado
Véase también