HotXLS crée des graphiques sparkline Excel — ces mini-graphiques qu'Excel dessine à l'intérieur d'une seule cellule — depuis Delphi et C++Builder en un seul appel : TXLSXWorksheet.AddSparklineGroup construit un groupe de sparklines sur une plage de données, et l'enregistrement du classeur écrit ce groupe sous la forme d'un bloc d'extension x14 à l'intérieur de l'élément extLst de la feuille de calcul, bloc que le moteur d'Excel 2010 et versions ultérieures affiche et que les lecteurs plus anciens ignorent sans problème. Pas d'objets de graphique, pas d'éléments de dessin, pas d'ancres
Le scénario qui justifie l'utilisation des sparklines est toujours le même. Un classeur de tableau de bord comporte quelques centaines de lignes, une par produit, région ou compte, avec douze chiffres mensuels chacune, et l'on souhaite afficher un indicateur de tendance à la fin de chaque ligne. Modélisez cela avec de vrais graphiques et vous créerez des centaines d'éléments de graphique DrawingML, chacun avec son propre composant XML, sa relation et sa géométrie d'ancrage, sans parler de l'effet sur la taille du fichier et le temps d'ouverture. Un groupe de sparklines est un bloc XML unique indiquant « dessiner une petite ligne de B2:M2 dans N2, et de B3:M3 dans N3 », répété à faible coût pour autant de lignes que nécessaire
Pourquoi les sparklines constituent-ils une extension x14 et non un graphique ?
Les sparklines sont apparus avec Excel 2010, trois ans après le gel du schéma de base ECMA-376, ils ne pouvaient donc pas figurer dans le balisage propre de la feuille de calcul sans casser la compatibilité avec les lecteurs existants. La réponse de Microsoft est le mécanisme de liste d'extensions : une feuille de calcul peut se terminer par un élément <extLst> contenant des blocs <ext>, chacun identifié par un URI qui caractérise la fonctionnalité ([MS-XLSX] §2.3.6). Les sparklines utilisent l'URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} et l'espace de noms x14. Un lecteur qui reconnaît ce GUID analyse le bloc ; un lecteur qui ne le reconnaît pas doit simplement l'ignorer. C'est tout l'intérêt de la compatibilité ascendante, et c'est pourquoi Excel 2007 ouvre un classeur contenant des sparklines sans encombre — il affiche simplement les données sources sans les graphiques
Un détail du mécanisme mérite d'être souligné car il contredit une supposition courante : aucune déclaration mc:Ignorable n'est requise sur la racine de la feuille de calcul. La présence du GUID d'extension suffit à elle seule, et le générateur propre d'Excel déclare l'espace de noms x14 localement sur l'élément <ext> plutôt que de modifier la racine. HotXLS follows the same pattern, which keeps the rest of the worksheet XML untouched. C'est également la différence de structure par rapport aux vrais graphiques : un graphique est un élément DrawingML distinct avec son propre processus de rendu, traité dans l'article complémentaire sur les graphiques, les images et les dessins, tandis qu'un sparkline est une métadonnée de feuille de calcul que la grille de calcul elle-même dessine
Comment ajouter des sparklines à un fichier XLSX par programmation ?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) est la méthode en un seul appel : elle crée un groupe du type indiqué, l'initialise avec la couleur de série par défaut d'Excel et ajoute le premier sparkline en associant une plage source qualifiée à une cellule hôte. Le composant TXLSXSparklineGroup retourné accepte ensuite d'autres sparklines via sa méthode Add, à raison d'une paire F/Sqref par ligne, tous partageant le type et la mise en forme du groupe. Pour le cas du tableau de bord, c'est exactement la structure souhaitée : un groupe, un ensemble d'options visuelles, et des centaines de membres
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;
Le type TXLSXSparklineType couvre les trois variantes proposées par Excel : xlsxSparklineLine pour les courbes de tendance, xlsxSparklineColumn pour les histogrammes miniatures et xlsxSparklineStacked pour les graphiques de type gains/pertes où chaque valeur s'affiche sous la forme d'un pavé orienté vers le haut ou vers le bas. Chaque sparkline membre se résume à deux chaînes — F, la plage source qualifiée, et Sqref, la cellule dans laquelle le graphique est dessiné — de sorte qu'il n'y a rien d'autre à configurer par ligne. Les groupes peuvent également être construits entièrement à la main via la collection Worksheet.SparklineGroups lorsque vous souhaitez partir d'un groupe vide plutôt que d'un modèle par défaut
Marqueurs, nuances de couleurs et mise à l'échelle des axes sur le modèle typé
TXLSXSparklineGroup expose tout le jeu d'options du ruban Outils Sparkline d'Excel sous forme de propriétés simples. Six indicateurs booléens mettent en valeur les points de données : Markers pour chaque point sur un sparkline de courbe, ainsi que HighPoint, LowPoint, NegativePoints, FirstPoint et LastPoint. Huit nuances de couleurs ARGB leur sont associées — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — avec pour règle qu'une case laissée à 0 est omise du fichier, Excel appliquant alors sa propre valeur par défaut. On retrouve le même format ARGB opaque partout dans la bibliothèque, de sorte que la valeur $FFD00000 désigne ici le même rouge que dans les styles de mise en forme conditionnelle
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;
Les propriétés des axes méritent réflexion avant d'en accepter les valeurs par défaut. MinAxisType et MaxAxisType acceptent chacun une mise à l'échelle individuelle, par groupe ou personnalisée : la mise à l'échelle individuelle ajuste chaque sparkline à ses propres valeurs minimale et maximale, ce qui fait qu'une ligne oscillant entre 99 et 101 aura l'air aussi spectaculaire qu'une ligne qui triple. La mise à l'échelle par groupe place tous les membres sur une échelle verticale commune, de sorte que la hauteur du tracé désigne la même quantité dans chaque ligne — ce que l'on recherche généralement sur un tableau de bord comparatif. DisplayEmptyCellsAs détermine l'impact d'une cellule source vide sur la courbe : laisser un espace, la traiter comme un zéro ou relier les points voisins en ignorant le vide
Ce que HotXLS écrit dans l'élément extLst de la feuille de calcul lors de l'enregistrement
Lors de l'enregistrement, HotXLS sérialise chaque groupe sous la forme d'un élément x14:sparklineGroup portant le type et les attributs d'affichage, les nuances de couleurs comme éléments enfants et une liste x14:sparklines dont les membres associent une formule de plage xm:f à une cellule hôte xm:sqref. L'ensemble de la structure réside dans l'élément <extLst><ext uri=\"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}\"> à la fin du composant de la feuille de calcul, avec l'espace de noms x14 déclaré directement sur le bloc, exactement comme Excel l'écrit. Une feuille de calcul sans groupe de sparklines n'émet aucun élément extLst, de sorte que les fichiers n'utilisant pas cette fonctionnalité ressortent identiques au niveau des octets à ce que produisaient les versions antérieures de HotXLS — la même rigueur de conservation que celle décrite dans l'article sur l'infrastructure de transfert sans perte
Un détail de la spécification importe si vous comparez la sortie avec celle d'Excel ou vérifiez manuellement le XML : l'épaisseur de ligne (lineWeight) par défaut dans le schéma est de 0.75 point, et non de 1.25 comme l'indiquent certaines sources secondaires. La spécification [MS-XLSX] définit CT_SparklineGroup@lineWeight avec une valeur par défaut de 0.75, ce qui correspond à l'épaisseur que l'interface utilisateur d'Excel applique réellement. HotXLS respecte cette valeur par défaut par omission : affectez à LineWeight une valeur autre que 0.75 et l'attribut est écrit, laissez-le à 0.75 et il ne l'est pas. Se tromper sur ce point produit des fichiers affichant des courbes légèrement plus épaisses ou plus fines que le même classeur enregistré depuis Excel
Allers-retours, copies de feuilles et extensions non modélisées par HotXLS
L'ouverture est l'image miroir de l'enregistrement. Lorsque HotXLS ouvre un classeur contenant des sparklines — que le fichier ait été écrit par HotXLS ou par Excel — l'analyseur cible le GUID d'extension des sparklines et reconstitue chaque groupe, membre, couleur et option d'axe dans le modèle typé. Ainsi, le cycle ouverture→édition→sauvegarde les préserve intégralement. Copier une feuille de calcul dans un autre classeur duplique ses groupes de sparklines avec le reste de la feuille, ce qui facilite la génération de rapports basés sur des modèles : conservez une feuille modèle stylisée, copiez-la par rapport et modifiez-en les plages
L'élément extLst peut également contenir des blocs d'extension pour lesquels HotXLS ne dispose pas de modèle typé — Excel écrit des blocs x14 pour des fonctionnalités comme les segments (slicers) et la mise en forme conditionnelle étendue dans cette même liste. Depuis la version v2.131.0, ces blocs tiers sont préservés en l'état lors d'un aller-retour au lieu d'être supprimés : l'analyseur les capture, les expose en lecture seule via Worksheet.RawWorksheetExts et les réécrit lors de l'enregistrement. Ils accompagnent également la feuille lorsqu'elle est copiée dans un autre classeur. Le XML préservé est reconstruit à partir d'événements de l'analyseur, il est donc sémantiquement équivalent à l'original plutôt qu'identique au niveau des octets, mais Excel l'accepte et les fonctionnalités survivent. La conséquence pratique est celle qui importe en production : l'ouverture d'un classeur client et son réenregistrement ne suppriment plus les extensions que vous n'avez pas demandé à HotXLS de comprendre
La limite réelle : les sparklines s'affichent sous Excel 2010 et versions ultérieures, ainsi que sur tout impression / lecteur implémentant l'extension x14. Excel 2007 affiche les données sans les graphiques, ce qui correspond à la dégradation prévue par le format. Les trois types de sparklines, les huit nuances de couleurs, les indicateurs de points et les trois modes d'axes couvrent tout le panel proposé par la boîte de dialogue d'Excel elle-même. La prise en charge des sparklines, ainsi que le reste du moteur XLSX présenté ici, est intégrée dans le composant HotXLS Delphi Excel Component pour Delphi et C++Builder