HotXLS crea minigráficos de Excel (los minigráficos que Excel dibuja dentro de una sola celda) desde Delphi y C++Builder con una sola llamada: TXLSXWorksheet.AddSparklineGroup construye un grupo de minigráficos sobre un rango de datos, y guardar el libro de trabajo lo escribe como un bloque de extensión x14 dentro del elemento extLst de la hoja de cálculo, que Excel 2010 y versiones posteriores procesan y los lectores más antiguos omiten sin quejas. Sin objetos de gráfico, sin partes de dibujo, sin anclajes
El escenario que hace que valga la pena contar con minigráficos es siempre el mismo. Un libro de trabajo de cuadro de mando 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. Si representara esto con gráficos reales, estaría creando cientos de partes de gráficos DrawingML, cada una con su propio archivo XML, relación y geometría de anclaje, por no hablar de lo que esto supone para el tamaño del archivo y el tiempo de apertura. Un grupo de minigráficos es un único bloque XML que indica "dibujar una pequeña línea de B2:M2 en N2, y de 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 cálculo sin alterar a todos los lectores existentes. La respuesta de Microsoft es el mecanismo de lista de extensiones: una hoja de cálculo puede finalizar con un elemento <extLst> que contiene bloques <ext>, cada uno de ellos 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 la razón por la 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 de este mecanismo porque contradice una suposición común: no se necesita ninguna declaración mc:Ignorable en la raíz de la hoja de cálculo. La puerta del GUID de la extensión es suficiente por sí misma, y el propio escritor de Excel declara el espacio de nombres x14 localmente en el elemento <ext> en lugar de modificar la raíz. HotXLS sigue el mismo patrón, lo que mantiene intacto el resto del XML de la hoja de cálculo. Esta es también la diferencia estructural con respecto a los gráficos reales: un gráfico es una parte de DrawingML independiente con su propio pipeline de renderizado, cubierto en el artículo complementario sobre gráficos, imágenes y dibujos, mientras que un minigráfico representa metadatos de la hoja de cálculo que dibuja la propia cuadrícula de la hoja de cálculo
¿Cómo añadir minigráficos a un archivo XLSX mediante programación?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) es la vía de una sola llamada: crea un grupo del tipo indicado, lo inicializa con el color de serie predeterminado de Excel y añade el primer minigráfico asociando un rango de origen calificado por hoja a una celda anfitriona. El TXLSXSparklineGroup devuelto acepta entonces más minigráficos a través de su método Add, un par F/Sqref por fila, todos compartiendo el tipo y formato del grupo. Para el caso del cuadro de mando, esa es exactamente la estructura que desea: 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];
// Un grupo: cada fila de producto comparte tipo y formato
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 las tres variantes que ofrece Excel: xlsxSparklineLine para líneas de tendencia, xlsxSparklineColumn para pequeños gráficos de barras y xlsxSparklineStacked para franjas de pérdidas/ganancias 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 completamente a mano a través de la colección Worksheet.SparklineGroups cuando se desea comenzar con un grupo vacío en lugar del valor predeterminado inicializado
Marcadores, ranuras de color y escala de ejes en el modelo con tipo
TXLSXSparklineGroup expone todo el conjunto de opciones de la cinta Herramientas de minigráfico de Excel como propiedades simples. Se seis interruptores booleanos destacan los 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 deja en 0 se omite del archivo y Excel aplica su propio valor predeterminado. El mismo formato ARGB totalmente opaco aparece en toda la biblioteca, por lo que $FFD00000 aquí significa el mismo rojo que en los estilos de formato condicional
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // los meses con pérdidas destacan
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // una escala para todas las filas
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 cada uno escala individual, de grupo o personalizada: la escala individual ajusta cada minigráfico a su propio mínimo y máximo, lo que hace que una fila que oscila entre 99 y 101 parezca tan espectacular como una fila que triplica su valor. La escala de grupo sitúa a todos los miembros en una misma escala vertical compartida, de modo que la altura del glifo representa la misma cantidad en cada fila, que suele ser lo que requiere un cuadro de mando comparativo. DisplayEmptyCellsAs determina qué hace una celda de origen vacía con una línea: dejar un espacio, contar como cero o salvar el hueco conectando a sus vecinos
Qué escribe HotXLS en el elemento extLst de la hoja de cálculo al guardar
Al guardar, HotXLS serializa cada grupo como un elemento x14:sparklineGroup que contiene los atributos de tipo y de alternancia, 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 anfitriona 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 cálculo, con el espacio de nombres x14 declarado directamente sobre el bloque, tal como lo escribe Excel. Una hoja de cálculo sin grupos de minigráficos no emite ningún elemento extLst, por lo que los archivos que nunca usaron esta característica resultan idénticos byte a byte a los producidos por las versiones anteriores de HotXLS; es la misma disciplina de escritor conservador descrita en el artículo sobre la infraestructura de viaje de ida y vuelta sin pérdidas
Un detalle de la especificación es importante si alguna vez compara los resultados con los de Excel o revisa 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, coincidiendo con el grosor que realmente aplica la interfaz de usuario de Excel. HotXLS respeta este valor predeterminado por omisión: si establece LineWeight en cualquier valor distinto de 0.75, se escribe el atributo; si lo deja en 0.75, no se escribe. Equivocarse en esto en cualquier dirección produce archivos que se renderizan de forma ligeramente más gruesa o más fina 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 la imagen especular del guardado. Cuando HotXLS abre un libro de trabajo que contiene minigráficos (ya sea que lo haya escrito HotXLS o Excel), el analizador filtra por el GUID de la extensión del minigráfico y reconstruye cada grupo, miembro, color y opción de eje en el modelo con tipo, por lo que un ciclo de abrir→editar→guardar los conserva por completo. Copiar una hoja de cálculo en otro libro 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 estilos, cópiela por informe y vuelva a definir los rangos
El elemento extLst también puede contener bloques de extensión para los que HotXLS no tiene un modelo con tipo; Excel escribe bloques x14 para características como segmentadores y formato condicional extendido en la misma lista. Desde la versión v2.131.0, esos bloques externos se conservan textualmente a través de un viaje de ida y vuelta en lugar de eliminarse: el analizador los captura, los expone como de solo lectura a través de Worksheet.RawWorksheetExts y los vuelve a escribir al guardar, viajando además 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 ser idéntico byte a byte, pero Excel lo acepta y las características sobreviven. La consecuencia práctica es la que importa en producción: abrir el libro de trabajo de un cliente y volver a guardarlo ya no elimina las extensiones que no se haya solicitado que HotXLS interprete
La línea divisoria honesta: los minigráficos se renderizan en Excel 2010 y posteriores, y en cualquier otro lector que implemente la extensión x14; Excel 2007 muestra los datos sin los glifos, que es la degradación para la cual fue diseñado el formato. Los tres tipos de minigráficos, las ocho ranuras de color, las opciones de puntos y los tres modos de eje cubren todo el abanico de opciones que ofrece el propio diálogo de Excel. La compatibilidad con minigráficos, junto con el resto del motor XLSX que se muestra aquí, se distribuye en el Componente de Hoja de Cálculo Delphi HotXLS para Delphi y C++Builder