O HotXLS cria Sparklines do Excel — os minigráficos que o Excel desenha dentro de uma única célula — a partir do Delphi e do C++Builder com uma chamada: TXLSXWorksheet.AddSparklineGroup constrói um grupo de sparklines sobre um intervalo de dados, e salvar a pasta de trabalho grava-o como um bloco de extensão x14 dentro da planilha extLst, o qual o Excel 2010 e posterior renderizam e leitores mais antigos ignoram sem reclamações. Sem objetos de gráfico, sem partes de desenho, sem âncoras
O cenário que faz valer a pena ter sparklines é sempre o mesmo. Uma pasta de trabalho de painel (dashboard) carrega algumas centenas de linhas, uma por produto, região ou conta, com doze valores mensais cada, e alguém deseja um glifo de tendência ao final de cada linha. Modele isso com gráficos reais e você estará criando centenas de partes de gráfico DrawingML, cada uma com sua própria parte XML, relacionamento e geometria de âncora, sem falar no que isso faz com o tamanho do arquivo e o tempo de abertura. Um grupo de sparklines é um único bloco XML que diz "desenhe uma linha minúscula de B2:M2 em N2, e de B3:M3 em N3", repetido de forma barata para quantas linhas você tiver
Por que as sparklines são uma extensão x14 em vez de um gráfico?
As sparklines surgiram com o Excel 2010, três anos após o congelamento do esquema base ECMA-376, de modo que não pouderam residir na própria marcação da planilha sem quebrar todos os leitores existentes. A resposta da Microsoft é o mecanismo de lista de extensões: uma planilha pode terminar com um elemento <extLst> contendo blocos <ext>, cada um marcado com uma URI que identifica o recurso ([MS-XLSX] §2.3.6). As sparklines usam a URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} e o namespace x14. Um leitor que reconhece o GUID analisa o bloco; um leitor que não o reconhece é obrigado a ignorá-lo. Essa é toda a história de compatibilidade futura, e é por isso que o Excel 2007 abre uma pasta de trabalho com sparkline de forma limpa — ele simplesmente exibe os números de origem sem os glifos
Um detalhe do mecanismo vale a pena destacar porque contradiz uma suposição comum: nenhuma declaração mc:Ignorable é necessária na raiz da planilha. O portal GUID ext é suficiente por si só, e o próprio gravador do Excel declara o namespace x14 localmente no elemento <ext> em vez de tocar na raiz. O HotXLS segue o mesmo padrão, o que mantém o restante do XML da planilha intocado. Esta também é a diferença estrutural em relação aos gráficos reais: um gráfico é uma parte DrawingML separada com seu próprio pipeline de renderização, abordado no artigo complementar sobre gráficos, imagens e desenhos, enquanto uma sparkline é um metadado da planilha que a própria grade de células pinta
Como adicionar sparklines a um arquivo XLSX programaticamente?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) é o caminho de chamada única: ele cria um grupo do tipo fornecido, preenche-o com a cor de série padrão do Excel e adiciona a primeira sparkline mapeando um intervalo de origem qualificado da planilha para uma célula hospedeira. O TXLSXSparklineGroup retornado aceita então mais sparklines através de seu método Add, um par F/Sqref por linha, todos compartilhando o tipo e a formatação do grupo. Para o caso do painel (dashboard), esse é exatamente o formato que você deseja: um grupo, um conjunto de opções visuais, centenas de membros
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 abrange os três tipos oferecidos pelo Excel: xlsxSparklineLine para linhas de tendência, xlsxSparklineColumn para minigráficos de barras e xlsxSparklineStacked para faixas de ganho/perda onde cada valor é renderizado como um bloco para cima ou para baixo. Cada sparkline membro consiste em apenas duas strings — F, o intervalo de origem qualificado da planilha, e Sqref, a célula onde o glifo é desenhado — portanto, não há mais nada a configurar por linha. Os grupos também podem ser construídos inteiramente à mão através da coleção Worksheet.SparklineGroups quando você deseja começar com um grupo em branco em vez do padrão inicial
Marcadores, slots de cores e escala de eixos no modelo tipado
TXLSXSparklineGroup expõe o conjunto completo de opções da faixa de opções Ferramentas de Minigráfico do Excel como propriedades simples. Seis seletores booleanos enfatizam pontos de dados: Markers para cada ponto em uma sparkline de linha, além de HighPoint, LowPoint, NegativePoints, FirstPoint e LastPoint. Oito slots de cores ARGB se emparelham com eles — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — com a convenção de que um slot deixado em 0 é omitido do arquivo e o Excel aplica seu próprio padrão. A mesma forma ARGB totalmente opaca aparece em toda a biblioteca, portanto, $FFD00000 aqui significa o mesmo vermelho que significa em estilos de formatação 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;
As propriedades dos eixos merecem um momento de reflexão antes de você aceitar os padrões. MinAxisType e MaxAxisType aceitam, cada um, escala individual, de grupo ou personalizada: a individual estica cada sparkline para seu próprio mínimo e máximo, o que faz com que uma linha que oscila entre 99 e 101 pareça tão dramática quanto uma linha que triplica de valor. A escala de grupo coloca todos os membros em uma escala vertical compartilhada, de modo que a altura do glifo signifique a mesma quantidade em cada linha — geralmente o que um painel de comparação deseja. DisplayEmptyCellsAs decide o que uma célula de origem vazia faz com uma linha: deixa um espaço, conta como zero ou preenche a lacuna conectando seus vizinhos
O que o HotXLS grava no extLst da planilha ao salvar
Ao salvar, o HotXLS serializa cada grupo como um elemento x14:sparklineGroup contendo os atributos de tipo e alternância, os slots de cores como elementos filhos e uma lista x14:sparklines cujos membros emparelham uma fórmula de intervalo xm:f com uma célula hospedeira xm:sqref. Toda a estrutura fica dentro de <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> no final da parte da planilha, com o namespace x14 declarado diretamente no bloco, exatamente como o Excel grava. Uma planilha sem grupos de sparkline não emite nenhum extLst, portanto, os arquivos que nunca usaram o recurso saem byte a byte idênticos ao que as versões anteriores do HotXLS produziam — a mesma disciplina de gravação conservadora descrita no artigo sobre infraestrutura de ida e volta sem perdas
Um detalhe da especificação importa se você comparar a saída com a do Excel ou verificar manualmente o XML: o padrão do esquema para lineWeight é de 0,75 pontos, e não os 1,25 que algumas fontes secundárias citam — o [MS-XLSX] define CT_SparklineGroup@lineWeight com um padrão de 0,75, correspondendo à espessura que a interface do usuário do Excel realmente aplica. O HotXLS honra o padrão por omissão: defina LineWeight para qualquer valor diferente de 0,75 e o atributo será gravado; deixe em 0,75 e ele não será. Errar isso em qualquer direção produz arquivos que renderizam sutilmente mais pesados ou mais leves do que a mesma pasta de trabalho salva a partir do Excel
Idas e voltas (round-trips), cópias de planilhas e extensões que o HotXLS não modela
A abertura é o reflexo da gravação. Quando o HotXLS opens a workbook que contém sparklines — seja gravada pelo HotXLS ou pelo Excel —, o analisador foca no GUID ext da sparkline e reconstrói cada grupo, membro, cor e opção de eixo no modelo tipado, de modo que um ciclo de abrir→editar→salvar os preserve completamente. Copiar uma planilha para outra pasta de trabalho clona seus grupos de sparkline junto com o restante da planilha, o que torna simples a geração de relatórios baseada em modelos: mantenha uma planilha de modelo estilizada, copie-a por relatório e aponte novamente os intervalos
O extLst também pode conter blocos de extensão para os quais o HotXLS não tem modelo tipado — o Excel grava blocos x14 para recursos como segmentações de dados (slicers) e formatação condicional estendida na mesma lista. Desde a v2.131.0, esses blocos externos são preservados literalmente ao longo de uma ida e volta em vez de serem descartados: o analisador os captura, os expõe como somente leitura através de Worksheet.RawWorksheetExts e os grava de volta ao salvar, e eles viajam com uma planilha quando ela é copiada para outra pasta de trabalho. O XML preservado é reconstruído a partir de eventos do analisador, portanto, é semanticamente equivalente ao original em vez de ser idêntico byte a byte, mas o Excel o aceita e os recursos sobrevivem. A consequência prática é a que importa em produção: abrir a pasta de trabalho de um cliente e salvá-la novamente não remove mais as extensões que você não solicitou que o HotXLS compreendesse
A linha de limite real: as sparklines são renderizadas no Excel 2010 e posterior, e em qualquer outro leitor que implemente a extensão x14; o Excel 2007 exibe os dados sem os glifos, que é a degradação para a qual o formato foi projetado. Os três tipos de sparkline, os slots de cores, os seletores de ponto e os três modos de eixo cobrem toda a superfície de opções oferecida pela própria caixa de diálogo do Excel. O suporte a sparkline, juntamente com o restante do mecanismo XLSX mostrado aqui, é fornecido no Componente Excel Delphi HotXLS para Delphi e C++Builder