HotXLS crea minigráficos (sparklines) de Excel —los pequeños gráficos que Excel dibuja dentro de una sola celda— desde Delphi y C++Builder con una llamada: TXLSXWorksheet.AddSparklineGroup construye un grupo de minigráficos sobre un rango de datos, y al guardar el libro de trabajo se escribe como un bloque de extensión x14 dentro del extLst de la hoja de trabajo, el cual Excel 2010 y posteriores renderizan y los lectores anteriores omiten sin quejas. Sin objetos de gráfico, sin partes de dibujo, sin anclajes
El escenario que hace que valga la pena tener minigráficos es siempre el mismo. Un libro de trabajo de panel de control contiene unos cientos de filas, una por producto, región o cuenta, con doce cifras mensuales cada una, y alguien desea un glifo de tendencia al final de cada fila. Modelar eso con gráficos reales significaría crear cientos de partes de gráficos DrawingML, cada una con su propia parte XML, relación y geometría de anclaje, por no hablar de lo que eso causaría al tamaño del archivo y al tiempo de apertura. Un grupo de minigráficos es un único bloque XML que indica "dibujar una pequeña línea desde B2:M2 en N2, y desde B3:M3 en N3", repetido de forma económica para tantas filas como tenga
¿Por qué los minigráficos son una extensión x14 en lugar de un gráfico?
Los minigráficos llegaron con Excel 2010, tres años después de que se congelara el esquema base ECMA-376, por lo que no podían residir en el propio marcado de la hoja de trabajo sin romper todos los lectores existentes. La respuesta de Microsoft es el mecanismo de lista de extensiones: una hoja de trabajo puede finalizar con un elemento <extLst> que contiene bloques <ext>, cada uno etiquetado con un URI que identifica la característica ([MS-XLSX] §2.3.6). Los minigráficos utilizan el URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} y el espacio de nombres x14. Un lector que reconoce el GUID analiza el bloque; un lector que no lo hace está obligado a omitirlo. Esa es toda la historia de compatibilidad futura, y es por eso que Excel 2007 abre un libro con minigráficos de forma limpia: simplemente muestra los números de origen sin los glifos
Vale la pena señalar un detalle del mecanismo porque contradice una suposición común: no se necesita ninguna declaración mc:Ignorable en la raíz de la hoja de trabajo. La validación del GUID de extensión es suficiente por sí sola, y el propio escritor de Excel declara el espacio de nombres x14 de forma local en el elemento <ext> en lugar de modificar la raíz. HotXLS sigue el mismo patrón, lo que mantiene el resto del XML de la hoja de trabajo intacto. Esta es también la diferencia estructural con los gráficos reales: un gráfico es una parte DrawingML independiente con su propia canalización de renderizado, analizada en el artículo complementario sobre gráficos, imágenes y dibujos, mientras que un minigráfico representa metadatos de la hoja de trabajo que la propia cuadrícula de la hoja de cálculo dibuja
¿Cómo agregar minigráficos a un archivo XLSX mediante programación?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) es la ruta de una sola llamada: crea un grupo del tipo dado, lo inicializa con el color de serie predeterminado de Excel y agrega el primer minigráfico asociando un rango de origen calificado por la hoja a una celda host. El TXLSXSparklineGroup devuelto acepta luego más minigráficos a través de su método Add, un par F/Sqref por fila, todos compartiendo el tipo y el formato del grupo. Para el caso del panel de control, esa es exactamente la forma que se busca: un grupo, un conjunto de opciones visuales y cientos de miembros
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Grp: TXLSXSparklineGroup;
Row: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('dashboard.xlsx');
Sheet := Book.Sheets[0];
// One group: every product row shares type and formatting
Grp := Sheet.AddSparklineGroup(xlsxSparklineLine,
'Sheet1!B2:M2', 'N2');
for Row := 3 to 201 do
Grp.Add(Format('Sheet1!B%d:M%d', [Row, Row]),
Format('N%d', [Row]));
Book.SaveAs('dashboard-trends.xlsx');
finally
Book.Free;
end;
end;
TXLSXSparklineType cubre los tres tipos que ofrece Excel: xlsxSparklineLine para líneas de tendencia, xlsxSparklineColumn para gráficos de barras pequeños y xlsxSparklineStacked para franjas de ganancias/pérdidas donde cada valor se renderiza como un bloque hacia arriba o hacia abajo. Cada minigráfico miembro consta solo de dos cadenas: F, el rango de origen calificado por la hoja, y Sqref, la celda en la que se dibuja el glifo, por lo que no hay nada más que configurar por fila. Los grupos también se pueden construir por completo a mano a través de la colección Worksheet.SparklineGroups cuando se desea comenzar con un grupo vacío en lugar del predeterminado inicializado
Marcadores, ranuras de color y escala de ejes en el modelo tipado
TXLSXSparklineGroup expone el conjunto completo de opciones de la cinta de Herramientas de minigráficos de Excel como propiedades simples. Seis selectores booleanos destacan puntos de datos: Markers para cada punto en un minigráfico de línea, además de HighPoint, LowPoint, NegativePoints, FirstPoint y LastPoint. Ocho ranuras de color ARGB se asocian con ellos (ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow) con la convención de que una ranura que se mantenga en 0 se omite del archivo y Excel aplica su propio valor predeterminado. La misma forma ARGB completamente opaca aparece en toda la biblioteca, por lo que $FFD00000 aquí representa el mismo rojo que en los estilos de formato condicional
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // losing months stand out
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // one scale for all rows
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;
Las propiedades de los ejes merecen un momento de reflexión antes de aceptar los valores predeterminados. MinAxisType y MaxAxisType admiten escalas individuales, de grupo o personalizadas: la individual estira cada minigráfico a su propio mínimo y máximo, lo que hace que una fila que fluctúa entre 99 y 101 se vea tan dramática como una que se triplica. La escala de grupo coloca a cada miembro en una escala vertical compartida, por lo que la altura del glifo representa la misma cantidad en cada fila, que suele ser lo que busca un panel de control comparativo. DisplayEmptyCellsAs determina qué hace una celda de origen vacía con una línea: dejar un espacio vacío, contar como cero o salvar el vacío conectando a sus vecinos
Qué escribe HotXLS en el extLst de la hoja de trabajo al guardar
Al guardar, HotXLS serializa cada grupo como un elemento x14:sparklineGroup que lleva los atributos de tipo y selectores, las ranuras de color como elementos secundarios y una lista x14:sparklines cuyos miembros asocian una fórmula de rango xm:f con una celda host xm:sqref. Toda la estructura se ubica dentro de <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> al final de la parte de la hoja de trabajo, con el espacio de nombres x14 declarado directamente en el bloque, tal como lo escribe Excel. Una hoja de trabajo sin grupos de minigráficos no emite ningún extLst, por lo que los archivos que nunca utilizaron la característica se generan idénticos byte a byte a lo que producían las versiones anteriores de HotXLS; la misma disciplina de escritura conservadora descrita en el artículo sobre infraestructura de ida y vuelta sin pérdidas
Un detalle de la especificación es importante si alguna vez compara el resultado con el de Excel o comprueba manualmente el XML: el valor predeterminado del esquema para lineWeight es de 0.75 puntos, no el de 1.25 que citan algunas fuentes secundarias; [MS-XLSX] define CT_SparklineGroup@lineWeight con un valor predeterminado de 0.75, que coincide con el grosor que realmente aplica la interfaz de usuario de Excel. HotXLS respeta el valor predeterminado por omisión: defina LineWeight en cualquier valor distinto de 0.75 y el atributo se escribirá; manténgalo en 0.75 y no se escribirá. Equivocarse en esto en cualquier dirección genera archivos que se renderizan sutilmente más pesados o más ligeros que el mismo libro de trabajo guardado desde Excel
Viajes de ida y vuelta, copias de hojas y extensiones que HotXLS no modela
La apertura es el reflejo exacto del guardado. Cuando HotXLS abre un libro de trabajo que contiene minigráficos (ya sea escrito por HotXLS o por Excel), el analizador valida el GUID de extensión de minigráfico y reconstruye cada grupo, miembro, color y opción de eje en el modelo tipado, de modo que un ciclo de abrir→editar→guardar los conserva por completo. Copiar una hoja de trabajo en otro libro de trabajo clona sus grupos de minigráficos junto con el resto de la hoja, lo que facilita la generación de informes basados en plantillas: conserve una hoja de plantilla con estilo, cópiela por informe y vuelva a direccionar los rangos
El extLst también puede contener bloques de extensión para los cuales HotXLS no tiene un modelo tipado; Excel escribe bloques x14 para características como segmentaciones de datos (slicers) y formato condicional extendido en la misma lista. Desde la versión v2.131.0, esos bloques externos se conservan textualmente a lo largo de un viaje de ida y vuelta en lugar de descartarse: el analizador los captura, los expone como de solo lectura a través de Worksheet.RawWorksheetExts, los vuelve a escribir al guardar y viajan con la hoja cuando esta se copia a otro libro. El XML conservado se reconstruye a partir de eventos del analizador, por lo que es semánticamente equivalente al original en lugar de idéntico byte a byte, pero Excel lo acepta y las características sobreviven. La consecuencia práctica es lo que importa en producción: abrir el libro de trabajo de un cliente y volver a guardarlo ya no elimina las extensiones que no le pedimos a HotXLS que interprete
El límite sincero: los minigráficos se renderizan en Excel 2010 y posteriores, y en any otro lector que implemente la extensión x14; Excel 2007 muestra los datos sin los glifos, que es la degradación para la cual el formato fue diseñado. Los tres tipos de minigráficos, las ocho ranuras de color, los selectores de puntos y los tres modos de eje cubren toda la gama de opciones que ofrece el propio diálogo de Excel. El soporte de minigráficos, junto con el resto del motor XLSX que se muestra aquí, se distribuye en el Componente HotXLS Delphi Excel para Delphi y C++Builder