HotXLS kreira Excel Sparklines — mini-grafikone koje Excel iscrtava unutar jedne ćelije — iz Delphi-ju i C++Builder-a pomoću jednog poziva: metoda TXLSXWorksheet.AddSparklineGroup gradi grupu mini-grafikona nad opsegom podataka, a čuvanje radne sveske upisuje je kao x14 blok ekstenzije unutar extLst liste radnog lista, što Excel 2010 i noviji renderuju, dok stariji čitači preskaču bez prigovora. Bez objekata grafikona, bez delova za crtanje, bez sidra (anchors)
Scenario u kom su mini-grafikoni preko potrebni uvek je isti. Kontrolna tabla (dashboard) u radnoj svesci nosi nekoliko stotina redova, po jedan za svaki proizvod, region ili nalog, sa po dvanaest mesečnih brojki, i neko želi glif trenda (trend glyph) na kraju svakog reda. Ako to modelirate sa pravim grafikonima, kreirate stotine DrawingML delova grafikona, svaki sa sopstvenim XML delom, relacijom i geometrijom sidra, a da ne pominjemo šta to radi veličini datoteke i vremenu otvaranja. Grupa mini-grafikona je jedan XML blok koji kaže "nacrtaj sićušnu liniju od B2:M2 u N2, i od B3:M3 u N3", što se jeftino ponavlja za onoliko redova koliko imate
Zašto su mini-grafikoni x14 ekstenzija, a ne grafikon
Mini-grafikoni su se pojavili sa verzijom Excel 2010, tri godine nakon što je osnovna ECMA-376 šema zamrznuta, tako da nisu mogli da žive u samom markupu radnog lista bez narušavanja kompatibilnosti sa svakim postojećim čitačem. Microsoft-ov odgovor je mehanizam liste ekstenzija: radni list se može završiti elementom <extLst> koji sadrži <ext> blokove, od kojih je svaki označen URI-jem koji identifikuje funkcionalnost ([MS-XLSX] §2.3.6). Mini-grafikoni koriste URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} i imenski prostor x14. Čitač koji prepoznaje GUID parsira blok. Čitač koji ga ne prepoznaje mora da ga preskoči. To je cela priča o kompatibilnosti unapred, i to je razlog zašto Excel 2007 čisto otvara radnu svesku sa mini-grafikonima — on jednostavno prikazuje izvorne brojeve bez glifova
Jedan detalj ovog mehanizma vredi istaći jer je u suprotnosti sa uobičajenom pretpostavkom: nikakva deklaracija mc:Ignorable nije potrebna na korenu radnog lista. GUID provera ekstenzije je sama po sebi dovoljna, a Excel-ov sopstveni pisač deklariše imenski prostor x14 lokalno na elementu <ext> umesto da dira koren. HotXLS prati isti obrazac, što ostatak XML-a radnog lista ostavlja netaknutim. To je takođe strukturna razlika u odnosu na prave grafikone: grafikon je poseban DrawingML deo sa sopstvenom linijom za renderovanje, što je pokriveno u pratećem članku o grafikonima, slikama i crtežima, dok je mini-grafikon metapodatak radnog lista koji sama mreža tabele iscrtava
Kako programski dodati mini-grafikone u XLSX datoteku
Metoda TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) predstavlja putanju od jednog poziva: kreira grupu datog tipa, popunjava je Excel-ovom podrazumevanom bojom serije i dodaje prvi mini-grafikon koji mapira opseg izvora kvalifikovan listom na ćeliju domaćina. Vraćeni objekat TXLSXSparklineGroup zatim prihvata više mini-grafikona kroz svoju metodu Add, po jedan par F/Sqref po redu, koji dele tip i formatiranje grupe. Za slučaj kontrolne table, to je upravo oblik koji želite: jedna grupa, jedan skup vizuelnih opcija, stotine članova
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;
Tip TXLSXSparklineType pokriva tri vrste koje Excel nudi: xlsxSparklineLine za linije trenda, xlsxSparklineColumn za sićušne stubičaste grafikone i xlsxSparklineStacked za win/loss trake gde se svaka vrednost iscrtava kao blok nagore ili nadole. Svaki član mini-grafikona čine samo dva stringa — F, opseg izvora kvalifikovan listom, i Sqref, ćelija u kojoj se iscrtava glif, tako da nema ničeg drugog za konfigurisanje po redu. Grupe se takođe mogu izgraditi potpuno ručno kroz kolekciju Worksheet.SparklineGroups kada želite da počnete od prazne grupe, a ne od podrazumevane
Markeri, slotovi boja i skaliranje osa na tipiziranom modelu
Klasa TXLSXSparklineGroup izlaže pun skup opcija iz Excel-ove trake Sparkline Tools kao obična svojstva. Šest logičkih prekidača (boolean toggles) naglašava tačke podataka: Markers za svaku tačku na linijskom mini-grafikonu, plus HighPoint, LowPoint, NegativePoints, FirstPoint i LastPoint. Osam ARGB slotova boja se uparuje sa njima — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — uz pravilo da se slot ostavljen na 0 izostavlja iz datoteke i Excel primenjuje sopstvenu podrazumevanu vrednost. Isti potpuno neprozirni ARGB oblik se pojavljuje širom biblioteke, pa $FFD00000 ovde označava istu crvenu boju kao i u stilovima uslovnog formatiranja
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;
Svojstva osa zaslužuju trenutak razmišljanja pre nego što prihvatite podrazumevane vrednosti. MinAxisType i MaxAxisType uzimaju pojedinačno, grupno ili prilagođeno skaliranje: pojedinačno rasteže svaki mini-grafikon na sopstveni minimum i maksimum, što čini da red koji varira između 99 i 101 izgleda podjednako dramatično kao i red koji se utrostručuje. Grupno skaliranje postavlja sve članove na jednu zajedničku vertikalnu skalu, tako da visina glifa označava istu količinu u svakom redu — što je obično ono što uporedna kontrolna tabla želi. Svojstvo DisplayEmptyCellsAs odlučuje šta prazna izvorna ćelija čini liniji: ostavlja prazninu, računa je kao nulu ili premošćuje rupu povezivanjem susednih tačaka
Šta HotXLS upisuje u extLst radnog lista prilikom čuvanja
Prilikom čuvanja, HotXLS serijalizuje svaku grupu kao x14:sparklineGroup element koji nosi atribute tipa i prekidača, slotove boja kao podređene elemente i x14:sparklines listu čiji članovi uparuju formulu opsega xm:f sa ćelijom domaćinom xm:sqref. Cela struktura se nalazi unutar <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> na kraju dela radnog lista, sa imenskim prostorom x14 deklarisanim na samom bloku, baš onako kako ga Excel upisuje. Radni list bez grupa mini-grafikona uopšte ne emituje extLst, tako da datoteke koje nikada nisu koristile ovu funkcionalnost ispadaju bajt-za-bajt identične onima koje su proizvele ranije verzije HotXLS-a — ista disciplina konzervativnog pisanja opisana u članku o infrastrukturi povratnog putovanja bez gubitaka (lossless round-trip)
Jedan detalj specifikacije je važan ako ikada uporedite izlaz sa Excel-ovim ili ručno proverite XML: podrazumevana vrednost šeme za lineWeight je 0.75 tačaka, a ne 1.25 što neki sekundarni izvori navode — [MS-XLSX] definiše CT_SparklineGroup@lineWeight sa podrazumevanom vrednošću 0.75, što odgovara debljini koju Excel-ov korisnički interfejs zapravo primenjuje. HotXLS poštuje podrazumevanu vrednost izostavljanjem: podesite LineWeight na bilo šta osim 0.75 i atribut će biti upisan. Ostavite ga na 0.75 i neće biti upisan. Greška u bilo kom smeru proizvodi datoteke koje se iscrtavaju suptilno deblje ili tanje od iste radne sveske sačuvane iz Excel-a
Povratna putovanja (round-trips), kopije listova i ekstenzije koje HotXLS ne modelira
Otvaranje je slika u ogledalu čuvanja. Kada HotXLS otvori radnu svesku koja sadrži mini-grafikone — bilo da ih je upisao HotXLS ili Excel — parser proverava GUID ekstenzije mini-grafikona i ponovo izgrađuje svaku grupu, člana, boju i opciju ose u tipizirani model, tako da ih ciklus otvori→izmeni→sačuvaj u potpunosti čuva. Kopiranje radnog lista u drugu radnu svesku klonira njegove grupe mini-grafikona zajedno sa ostatkom lista, što generisanje izveštaja vođeno šablonima čini jednostavnim: zadržite stilizovani šablon lista, kopirajte ga po izveštaju i ponovo usmerite opsege
Lista extLst takođe može da sadrži blokove ekstenzija za koje HotXLS nema tipizirani model — Excel upisuje x14 blokove za funkcije kao što su slajseri (slicers) i prošireno uslovno formatiranje u istu listu. Od verzije v2.131.0 ti strani blokovi se čuvaju doslovno tokom povratnog putovanja umesto da budu odbačeni: parser ih hvata, izlaže ih kao samo za čitanje preko Worksheet.RawWorksheetExts i upisuje ih nazad pri čuvanju, a oni putuju sa listom kada se on kopira u drugu radnu svesku. Sačuvani XML se rekonstruiše iz događaja parsera, tako da je semantički ekvivalentan originalu, a ne bajt-za-bajt identičan, ali ga Excel prihvata i funkcije opstaju. Praktična posledica je ona koja je važna u produkciji: otvaranje klijentove radne sveske i ponovno čuvanje više ne briše ekstenzije za koje niste tražili da ih HotXLS razume
Iskrena granična linija: mini-grafikoni se iscrtavaju u Excel-u 2010 i novijim verzijama, kao i u bilo kom drugom čitaču koji implementira x14 ekstenziju. Excel 2007 prikazuje podatke bez glifova, što je degradacija za koju je ovaj format i dizajniran. Tri tipa mini-grafikona, osam slotova boja, prekidači tačaka i tri režima ose pokrivaju čitavu površinu opcija koje nudi Excel-ov sopstveni dijalog. Podrška za mini-grafikone, zajedno sa ostatkom XLSX mehanizma prikazanim ovde, dolazi u HotXLS Delphi Excel komponenti za Delphi i C++Builder