Komponenta HotXLS umožňuje vytvářet excelové minigrafy (sparklines) — miniaturní grafy, které Excel vykresluje uvnitř jediné buňky — z prostředí Delphi a C++Builder pomocí jediného volání: metoda TXLSXWorksheet.AddSparklineGroup vytvoří skupinu minigrafů nad vybranou oblastí dat a uložení sešitu ji zapíše jako blok rozšíření x14 do seznamu extLst listu. Excel 2010 a novější verze tento blok vykreslí, zatímco starší čtečky jej bez jakýchkoli stížností přeskočí. Nepoužívají se žádné objekty grafů, kreslicí prvky ani kotvy
Scénář, kdy se minigrafy vyplatí použít, je vždy stejný. Manažerský přehled (dashboard) obsahuje několik stovek řádků, například pro jednotlivé produkty, regiony nebo účty, přičemž každý řádek nese dvanáct měsíčních hodnot. A na konci každého řádku je požadován symbol trendu. Pokud byste to řešili klasickými grafy, museli byste vytvořit stovky objektů grafů v DrawingML, z nichž každý by měl vlastní část XML, vazby a geometrii ukotvení — nemluvě o dopadu na velikost souboru a dobu jeho otevírání. Skupina minigrafů je naproti tomu jediný XML blok definující pravidlo „vykresli malou čáru z oblasti B2:M2 do buňky N2 a z B3:M3 do N3,“ což se efektivně opakuje pro libovolný počet řádků
Proč jsou minigrafy rozšířením x14 namísto běžného grafu?
Minigrafy se objevily s příchodem aplikace Excel 2010, tedy tři roky po schválení základního schématu ECMA-376. Nemohly proto být umístěny přímo ve standardním kódu listu, aniž by to narušilo funkčnost stávajících čteček. Řešením ze strany Microsoftu byl mechanismus seznamů rozšíření (extension list): list může končit prvkem <extLst> obsahujícím bloky <ext>, z nichž každý je označen identifikátorem URI definujícím danou funkci ([MS-XLSX] §2.3.6). Minigrafy používají URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} and jmenný prostor x14. Čtečka, která tento GUID zná, blok zpracuje; ta, která ho nezná, ho musí přeskočit. To zajišťuje dopřednou kompatibilitu a díky tomu Excel 2007 otevře sešit s minigrafy bez chyb — pouze zobrazí zdrojová čísla bez grafických symbolů
Jeden detail tohoto mechanismu stojí za zmínku, protože vyvrací běžný předpoklad: na kořeni listu není vyžadována žádná deklarace mc:Ignorable. Kontrola na základě GUID v tagu ext plně dostačuje a samotný Excel deklaruje jmenný prostor x14 lokálně na prvku <ext>, aniž by zasahoval do kořene listu. HotXLS postupuje stejně, což ponechává zbytek XML listu beze změn. V tom spočívá také strukturální rozdíl oproti běžným grafům: klasický graf je samostatný prvek DrawingML s vlastní vykreslovací frontou (jak popisuje článek o grafech, obrázcích a kresbách), zatímco minigraf představuje metadata listu, která vykresluje přímo mřížka tabulky
Jak programově přidat minigrafy do souboru XLSX?
Volání TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) je nejrychlejší cestou: vytvoří skupinu daného typu, nastaví výchozí barvu řady Excelu a přidá první minigraf mapující zdrojovou oblast na cílovou buňku. Vrácený objekt TXLSXSparklineGroup pak přijímá další minigrafy prostřednictvím své metody Add — jednu dvojici F/Sqref pro každý řádek, přičemž všechny sdílejí společný typ a formátování skupiny. V případě manažerských přehledů jde o ideální řešení: jedna skupina, jedno vizuální nastavení a stovky položek
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;
Typ TXLSXSparklineType pokrývá tři formáty nabízené Excelem: xlsxSparklineLine pro spojnicové grafy trendů, xlsxSparklineColumn pro miniaturní sloupcové grafy a xlsxSparklineStacked pro pruhy výher/proher (win/loss), kde se každá hodnota vykresluje jako blok nahoru nebo dolů. Každý jednotlivý minigraf tvoří pouze dva řetězce — F (zdrojová oblast definovaná názvem listu) a Sqref (buňka, do které se graf vykreslí), takže u jednotlivých řádků není třeba nastavovat nic dalšího. Skupiny lze také vytvářet ručně prostřednictvím kolekce Worksheet.SparklineGroups, pokud chcete začít s prázdnou skupinou namísto použití výchozího nastavení
Značky, barevné sloty a měřítko os v typovaném modelu
Objekt TXLSXSparklineGroup zpřístupňuje kompletní sadu voleb z pásu karet Nástroje minigrafu v Excelu jako běžné vlastnosti. Šest přepínačů typu Boolean slouží ke zvýraznění datových bodů: Markers pro každý bod ve spojnicovém grafu, dále HighPoint (nejvyšší bod), LowPoint (nejnižší bod), NegativePoints (záporné body), FirstPoint (první bod) a LastPoint (poslední bod). S nimi se pojí osm barevných slotů ARGB — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — s tím, že pokud ponecháte hodnotu 0, zápis se do souboru neprovede a Excel použije vlastní výchozí barvy. Stejný formát plně neprůhledných barev ARGB se používá v celé knihovně, takže například $FFD00000 zde představuje stejnou červenou jako v stylech podmíněného formátování
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;
Vlastnosti os stojí za zvážení předtím, než přijmete výchozí hodnoty. MinAxisType a MaxAxisType podporují individuální, skupinové nebo vlastní měřítko: individuální přizpůsobí měřítko každého minigrafu jeho vlastním minimům a maximům, což způsobí, že řádek kolísající mezi hodnotami 99 a 101 vypadá stejně dramaticky jako řádek s trojnásobným nárůstem. Skupinové měřítko nastaví pro všechny členy společnou svislou osu, takže výška grafu vyjadřuje stejné množství na každém řádku — což je obvykle to, co u srovnávacího dashboardu potřebujete. Vlastnost DisplayEmptyCellsAs určuje, jak prázdná zdrojová buňka ovlivní spojnici: zda ponechá mezeru, bude se počítá jako nula, nebo mezeru přemostí propojením sousedních bodů
Co HotXLS zapisuje do extLst listu při uložení
Při uložení serializuje HotXLS každou skupinu jako prvek x14:sparklineGroup obsahující atributy typu a přepínačů, barevné sloty jako podřízené prvky a seznam x14:sparklines, jehož položky párují vzorec oblasti xm:f s cílovou buňkou xm:sqref. Celá tato struktura se nachází uvnitř <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> na konci XML listu, přičemž jmenný prostor x14 je deklarován přímo na tomto bloku, přesně tak, jak to zapisuje Excel. List, který neobsahuje žádné skupiny minigrafů, nevygeneruje žádný prvek extLst. Soubory, které tuto funkci nevyužívají, jsou proto na bajt shodné s výstupy ze starších verzí HotXLS — což odpovídá zásadám šetrného zápisu popsaným v článku o bezztrátové infrastruktuře zpětného přenosu
Pokud někdy porovnáváte výstup s Excelem nebo ručně kontrolujete XML, záleží na jednom detailu specifikace: výchozí hodnota schématu pro lineWeight je 0,75 bodu, nikoli 1,25, jak uvádějí některé sekundární zdroje. Specifikace [MS-XLSX] definuje CT_SparklineGroup@lineWeight s výchozí hodnotou 0,75, což odpovídá tloušťce, kterou uživatelské rozhraní Excelu reálně používá. HotXLS toto výchozí nastavení respektuje: pokud nastavíte LineWeight na jinou hodnotu než 0,75, atribut se zapíše; pokud ji ponecháte na 0,75, nezapíše se. Chyba v obou směrech vede k tomu, že se grafy vykreslí o něco silnější nebo tenčí než v případě sešitu uloženého přímo z Excelu
Zpětné přenosy (round-trips), kopírování listů a rozšíření, která HotXLS nemodeluje
Načítání je zrcadlovým obrazem ukládání. Když HotXLS otevře sešit obsahující minigrafy (bez ohledu na to, zda jej vytvořil HotXLS nebo Excel), analyzátor zachytí GUID rozšíření minigrafu a sestaví každou skupinu, položku, barvu i možnost osy do typovaného modelu. Cyklus otevření→úprava→uložení je tak zachová kompletní. Kopírování listu do jiného sešitu zkopíruje i jeho skupiny minigrafů společně se zbytkem listu, což usnadňuje generování sestav na základě šablon: ponecháte si nastavený list šablony, zkopírujete jej pro každou sestavu a přesměrujete rozsahy dat
Seznam extLst může obsahovat také bloky rozšíření, pro které HotXLS nemá typovaný model — Excel do stejného seznamu zapisuje bloky x14 pro funkce, jako jsou průřezy (slicers) a rozšířené podmíněné formátování. Od verze v2.131.0 jsou tyto cizí bloky při zpětném přenosu zachovány v nezměněné podobě namísto toho, aby byly odstraneny: analyzátor je zachytí, zpřístupní je pouze pro čtení prostřednictvím vlastnosti Worksheet.RawWorksheetExts a při uložení je zapíše zpět. Cestují tak s listem i při jeho kopírování do jiného sešitu. Zachované XML se rekonstruuje z událostí analyzátoru, takže je sémanticky ekvivalentní s originálem, i když není bajtově identické. Excel jej však bez problémů přijímá a funkce zůstávají zachovány. Praktický dopad je klíčový pro produkční nasazení: otevření zákaznického sešitu a jeho opětovné uložení již neodstraní rozšíření, která HotXLS nemusí znát
Reálné omezení: minigrafy se zobrazují v Excelu 2010 a novějším a v jakémkoli jiném prohlížeči, který implementuje rozšíření x14. Excel 2007 zobrazí pouze data bez grafických prvků, což odpovídá degradaci, pro kterou byl formát navržen. Tři typy minigrafů, osm barevných slotů, přepínače bodů a tři režimy os pokrývají kompletní sadu voleb, které nabízí dialogové okno samotného Excelu. Podpora minigrafů, společně se zbytkem zde představeného motoru XLSX, je součástí produktu HotXLS Delphi Excel Component pro Delphi a C++Builder