Documentación HotXLS

Geometría de esquemas dispersos

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

NodeIndexLa fila o columna de resumen física consultada por el llamador
FirstDetailIndex / LastDetailIndexEl intervalo de detalle contiguo cuyo nivel es más profundo que el elemento de resumen
SummaryLevelEl nivel de esquema almacenado en el elemento de resumen, o cero cuando ese elemento no está materializado
LevelEl nivel de grupo representado por el nodo, igual a SummaryLevel + 1
SummaryHiddenEl estado oculto almacenado en el elemento de resumen
CollapsedLa marca de contracción explícita almacenada en el elemento de resumen
SummaryAfterTrue 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
xocPreserveCambia el nodo seleccionado conservando las marcas de contracción de los descendientes, que es el comportamiento predeterminado con grupos anidados
xocCollapseMarca como contraídos los nodos descendientes que están dentro del nodo seleccionado u ocultos por debajo del nivel de presentación solicitado
xocExpandBorra 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

Miembros adicionales de la API XLS clásica
Miembros avanzados de la API XLSX
Miembros adicionales de la API de la biblioteca