Artigo Técnico

Sparklines do Excel em Delphi: HotXLS e a Extensão x14

O HotXLS permite criar Sparklines do Excel — os mini gráficos que o Excel desenha no interior de uma única célula — a partir de Delphi e C++Builder com uma chamada: o método TXLSXWorksheet.AddSparklineGroup constrói um grupo de sparklines sobre um intervalo de dados, gravando-o como um bloco de extensão x14 no elemento extLst da folha de cálculo. Versões do Excel a partir de 2010 desenham o elemento graficamente, enquanto leitores antigos o ignoram sem gerar erros. Sem objetos de gráficos, elements de desenho ou âncoras

A utilidade desta funcionalidade é evidente: se um painel de controlo (dashboard) contiver centenas de linhas para produtos ou contas (com doze valores mensais cada) e requerer um indicador de tendência ao final de cada linha, desenhar gráficos reais exigiria criar centenas de secções DrawingML. Tal abordagem pesaria no tamanho do ficheiro e no tempo de abertura. O grupo de sparklines consiste num bloco XML único que instrui a "desenhar uma linha minúscula de B2:M2 na célula N2, e de B3:M3 em N3", repetindo-se o processo para todas as linhas com baixo custo computacional

Por que razão os sparklines são extensões x14 e não gráficos?

Os sparklines foram introduzidos no Excel 2010, três anos após a definição do esquema ECMA-376 base, pelo que a sua inclusão no XML da folha comprometeria a compatibilidade de leitura. A solução da Microsoft baseou-se na lista de extensões: a folha de cálculo termina com o elemento <extLst><ext> que contém blocos <ext>, cada um marcado com o URI correspondente à funcionalidade ([MS-XLSX] §2.3.6). Os sparklines utilizam o URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} e o namespace x14. Leitores compatíveis processam o bloco e os restantes ignoram-no, assegurando a compatibilidade. Assim, o Excel 2007 abre estes ficheiros de forma limpa, omitindo os gráficos e exibindo os valores numéricos originais

Particularidade do mecanismo: não é necessária a declaração mc:Ignorable na raiz da folha de cálculo. A validação do GUID de ext é suficiente por si só, declarando o próprio gerador do Excel o namespace x14 localmente no elemento <ext>. O HotXLS segue este padrão, preservando o restante XML da folha de cálculo. Esta é a diferença estrutural face aos gráficos convencionais: o gráfico constitui uma secção DrawingML independente com rotinas próprias (abordadas no artigo sobre gráficos, imagens e desenhos), ao passo que o sparkline consiste em metadados da folha desenhados na grelha

Como adicionar sparklines a um ficheiro XLSX via código?

O método TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) resolve o processo: cria um grupo do tipo especificado, define a cor padrão da série e associa a primeira relação entre o intervalo de origem e a célula de destino. A classe retornada TXLSXSparklineGroup suporta novas associações via método Add (um par de F/Sqref por linha), partilhando todas as mesmas definições estéticas. No caso de dashboards, esta estrutura é ideal: um único grupo centraliza a formatação para centenas de itens:

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Grp: TXLSXSparklineGroup;
  Row: Integer;
begin
  Book := TXLSXWorkbook.Create;
  try
    Book.Open('dashboard.xlsx');
    Sheet := Book.Sheets[0];

    // Um grupo único: todas as linhas de produtos partilham o tipo e formatação
    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;

O campo TXLSXSparklineType cobre as três variantes oferecidas no Excel: xlsxSparklineLine para linhas de tendência, xlsxSparklineColumn para minigráficos de barras e xlsxSparklineStacked para gráficos de ganho/perda. Cada elemento do sparkline é definido por duas strings — F (intervalo de origem) e Sqref (célula de destino) —, sem parametrizações adicionais por linha. Os grupos podem também ser criados manualmente na coleção Worksheet.SparklineGroups

Marcadores, canais de cor e escala de eixos no modelo de dados

A classe TXLSXSparklineGroup disponibiliza as opções da barra de ferramentas do Excel sob a forma de propriedades simples. Seis seletores booleanos controlam a exibição dos pontos: Markers (para todos os pontos de sparklines de linha), HighPoint, LowPoint, NegativePoints, FirstPoint e LastPoint. Oito canais de cor ARGB associam-se a estes estados (ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow), determinando o valor 0 a omissão no ficheiro (adotando o Excel a sua cor padrão). O formato ARGB é idêntico em toda a biblioteca, correspondendo o valor $FFD00000 ao mesmo tom de vermelho analisado no artigo sobre formatação condicional:

Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
  'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True;          // destacar os meses com perdas
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup;   // escala comum para todas as linhas
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;

As propriedades dos eixos influenciam o resultado gráfico. Os campos MinAxisType e MaxAxisType suportam escalas individuais, de grupo ou personalizadas. A escala individual estende cada minigráfico aos seus limites parciais, o que faz variações pequenas (ex: entre 99 e 101) parecerem tão acentuadas quanto variações de amplitude tripla. A escala de grupo (group) aplica uma base vertical comum a todos os elementos, garantindo a proporcionalidade visual das barras (indicada para painéis comparativos). A propriedade DisplayEmptyCellsAs define o comportamento para células vazias: exibir espaço (gap), tratar como zero ou interpolar ligando os pontos adjacentes

Gravação dos dados extLst pelo HotXLS

Na gravação, o HotXLS serializes cada grupo como um elemento x14:sparklineGroup com as respetivas propriedades, exportando as cores como sub-elementos e listando em x14:sparklines a fórmula xm:f e a célula xm:sqref. O bloco é guardado sob <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> no final do ficheiro XML da folha de cálculo com a declaração x14 local, tal como gerado pelo Excel. Folhas de cálculo sem sparklines não criam o elemento extLst, resultando em ficheiros idênticos aos de versões anteriores, de acordo com as semânticas abordadas no artigo sobre compatibilidade e integridade de escrita

Particularidade do esquema: o valor padrão de lineWeight é 0.75 pontos e não 1.25 como citado incorretamente em alguma documentação. O regulamento [MS-XLSX] define o padrão de CT_SparklineGroup@lineWeight em 0.75 (espessura real adotada no Excel). O HotXLS respeita o padrão por omissão: se definir LineWeight para valores diferentes de 0.75 a propriedade é gravada, omitindo-se se mantiver o valor padrão, o que evita variações estéticas de espessura

Ciclos de leitura/gravação, cópias e extensões genéricas

A leitura é simétrica à gravação. Ao ler um ficheiro com sparklines (gerados pelo HotXLS ou pelo Excel), o analisador identifica o GUID e preenche o modelo de dados correspondente, assegurando a integridade em ciclos de alteração. A cópia de folhas de cálculo entre livros duplica os grupos de sparklines, simplificando a geração de relatórios com modelos (onde basta copiar a folha estilizada e atualizar as coordenadas dos intervalos)

O elemento extLst pode conter dados de extensões que o HotXLS não implemente diretamente (como segmentações de dados/slicers ou formatações condicionais complexas). Desde a versão v2.131.0, estes blocos desconhecidos são preservados em ciclos de gravação, sendo acedidos via Worksheet.RawWorksheetExts e duplicados em cópias de folhas. O XML é reconstruído a partir do analisador de eventos, garantindo a conformidade lógica e a aceitação no Excel. Isto assegura que a reescrita de ficheiros não corrompe ou elimina definições complexas presentes no documento original

Compatibilidade: os sparklines são visualizados a partir do Excel 2010 e restantes leitores compatíveis com a extensão x14, mostrando o Excel 2007 apenas os dados numéricos de base. O suporte para os três tipos de sparklines, canais de cor, pontos notáveis e eixos integra o HotXLS Delphi Excel Component para Delphi e C++Builder