HotXLS ustvarja mini grafikone (Sparklines) Excela — drobne grafikone, ki jih Excel izriše znotraj posamezne celice — iz Delphija in C++Builderja z enim klicem: TXLSXWorksheet.AddSparklineGroup zgradi skupino mini grafikonov nad podatkovnim območjem, shranjevanje delovnega zvezka pa jo zapiše kot razširitveni blok x14 znotraj seznama razširitev extLst delovnega lista, ki ga Excel 2010 in novejši izrišejo, starejši bralniki pa preskočijo brez pritožb. Brez objektov grafikonov, risalnih delov ali sider
Scenarij, zaradi katerega so mini grafikoni nepogrešljivi, je vedno enak. Nadzorna plošča (dashboard) vsebuje nekaj sto vrstic, eno za vsak izdelek, regijo ali račun, vsaka z dvanajstimi mesečnimi podatki, nekdo pa želi grafični znak trenda (trend glyph) na koncu vsake vrstice. Če bi to modelirali z dejanskimi grafikoni, bi morali ustvariti na stotine delov grafikonov DrawingML, od katerih bi vsak imel svoj del XML, relacijo in geometrijo sidra, da sploh ne govorimo o vplivu na velikost datoteke in čas odpiranja. Skupina mini grafikonov pa je en sam blok XML, ki pravi "nariši drobno črto iz B2:M2 v N2 in iz B3:M3 v N3", kar se poceni ponovi za toliko vrstic, kolikor jih imate
Zakaj so mini grafikoni razširitev x14 in ne grafikon?
Mini grafikoni so se pojavili z Excelom 2010, tri leta po tem, ko je bila osnovna shema ECMA-376 zamrznjena, zato niso mogli živeti neposredno v označevanju delovnega lista, ne da bi s tem pokvarili vsak obstoječi bralnik. Microsoftov odgovor je mehanizem seznama razširitev: delovni list se lahko konča z elementom <extLst>, ki vsebuje bloke <ext>, od katerih je vsak označen z URI-jem, ki prepozna to funkcijo ([MS-XLSX] §2.3.6). Mini grafikoni uporabljajo URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} in imenski prostor x14. Bralnik, ki prepozna to vrednost GUID, razčleni blok; bralnik, ki je ne prepozna, jo mora preskočiti. To je celotna zgodba o združljivosti za naprej in zato Excel 2007 nemoteno odpre delovni zvezek z mini grafikoni — preprosto prikaže izvorne številke brez grafičnih znakov
Eno podrobnost mehanizma je vredno izpostaviti, ker nasprotuje splošni predpostavki: na korenskem elementu delovnega lista ni potrebna nobena deklaracija mc:Ignorable. Sama kontrola razširitve GUID zadošča, Excelov lastni zapisovalnik pa deklarira imenski prostor x14 lokalno na elementu <ext>, namesto da bi posegal v koren. HotXLS sledi enakemu vzorcu, kar ohranja preostali XML delovnega lista nedotaknjen. To je tudi strukturna razlika od dejanskih grafikonov: grafikon je ločen del DrawingML z lastnim cevovodom upodabljanja, kot je opisano v spremljevalnem članku o grafikonih, slikah in risbah, medtem ko je mini grafikon metapodatek delovnega lista, ki ga izrisuje sama mreža preglednice
Kako programsko dodati mini grafikone v datoteko XLSX?
Klic TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) predstavlja pot z enim klicem: ustvari skupino podanega tipa, jo napolni s privzeto barvo serije Excela in doda prvi mini grafikon, ki preslika izvorno območje, označeno z imenom lista, na celico gostiteljico. Vrnjeni TXLSXSparklineGroup nato sprejema dodatne mini grafikone prek svoje metode Add, en par F/Sqref na vrstico, pri čemer si vsi delijo isti tip in oblikovanje skupine. Za primer nadzorne plošče je to natanko tisto, kar potrebujete: ena skupina, en nabor vizualnih možnosti, na stotine članov
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 pokriva tri vrste, ki jih ponuja Excel: xlsxSparklineLine za trendne črte, xlsxSparklineColumn za drobne stolpčne grafikone in xlsxSparklineStacked za pasove win/loss, kjer se vsaka vrednost izriše kot dvignjen ali spuščen blok. Vsak posamezen mini grafikon sestavljata le dva niza — F, izvorno območje z imenom lista, in Sqref, celica, v kateri se izriše grafični znak —, tako da ni treba ničesar drugega konfigurirati za posamezno vrstico. Skupine lahko zgradite tudi ročno prek zbirke Worksheet.SparklineGroups, ko želite začeti s prazno skupino namesto s privzeto napolnjeno
Markerji, barvne reže in skaliranje osi na tipiziranem modelu
TXLSXSparklineGroup izpostavlja celoten nabor možnosti iz Excelovega traku Orodja za mini grafikone (Sparkline Tools) kot preproste lastnosti. Šest logičnih stikal (toggles) poudarja podatkovne točke: Markers za vsako točko na črtnem mini grafikonu ter HighPoint, LowPoint, NegativePoints, FirstPoint in LastPoint. Osem barvnih rež ARGB se povezuje z njimi — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow —, pri čemer velja pravilo, da se reža, ki jo pustite na 0, izpusti iz datoteke, Excel pa uporabi svojo privzeto nastavitev. Enaka popolnoma neprosojna oblika ARGB se pojavlja po vsej knjižnici, zato $FFD00000 tukaj pomeni isto rdečo barvo kot v slogih pogojnega oblikovanja
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;
Lastnosti osi si zaslužijo premislek, preden sprejmete privzete nastavitve. MinAxisType in MaxAxisType vsak sprejmeta individualno, skupinsko ali prilagojeno skaliranje: individualno raztegne vsak mini grafikon na lastni minimum in maksimum, zaradi česar je vrstica, ki niha med 99 in 101, videti tako dramatično kot vrstica, ki se potroji. Skupinsko skaliranje postavi vse člane na isto navpično lestvico, tako da višina grafičnega znaka pomeni enako količino v vsaki vrstici — kar je običajno tisto, kar želi primerjalna nadzorna plošča. DisplayEmptyCellsAs določa, kaj prazna izvorna celica naredi s črto: pusti vrzel, jo šteje kot nič ali premosti luknjo s povezovanjem njenih sosedov
Kaj HotXLS zapiše v extLst delovnega lista ob shranjevanju
Ob shranjevanju HotXLS vsako skupino serijsko zapiše kot element x14:sparklineGroup, ki nosi atribute tipa in stikal, barvne reže kot podrejene elemente ter seznam x14:sparklines, katerega člani povezujejo formulo območja xm:f s celico gostiteljico xm:sqref. Celotna struktura se nahaja znotraj <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> na koncu dela z delovnim listom, z imenskim prostorom x14, deklariranim neposredno na bloku, natanko tako, kot to zapiše Excel. Delovni list brez skupin mini grafikonov sploh ne oddaja elementa extLst, zato so datoteke, ki te funkcije niso nikoli uporabljale, bajt za bajtom enake tistim, ki so jih ustvarile starejše različice HotXLS — enaka disciplina konzervativnega zapisovalnika, kot je opisana v članku o infrastrukturi za nemoteno povratno potovanje (round-trip)
Ena podrobnost specifikacije je pomembna, če kdaj primerjate izhod z Excelovim or ročno preverjate XML: privzeta vrednost sheme za lineWeight je 0,75 točke, in ne 1,25, kar navajajo nekateri sekundarni viri — [MS-XLSX] definira CT_SparklineGroup@lineWeight s privzeto vrednostjo 0,75, kar ustreza debelini, ki jo Excelov uporabniški vmesnik dejansko uporabi. HotXLS spoštuje to privzeto vrednost z opustitvijo: nastavite LineWeight na karkoli drugega kot 0,75 in atribut se zapiše; pustite ga na 0,75 in se ne zapiše. Če se pri tem zmotite v katero koli smer, dobite datoteke, ki se izrišejo nekoliko debelejše ali tanjše od istega delovnega zvezka, shranjenega iz Excela
Povratna potovanja (round-trips), kopije listov in razširitve, ki jih HotXLS ne modelira
Odpiranje je zrcalna slika shranjevanja. Ko HotXLS odpre delovni zvezek, ki vsebuje mini grafikone — ne glede na to, ali ga je zapisal HotXLS ali Excel —, se razčlenjevalnik usmeri na GUID razširitve mini grafikonov in znova zgradi vsako skupino, člana, barvo in možnost osi v tipiziran model, tako da jih cikel odpri→uredi→shrani popolnoma ohrani. Kopiranje delovnega lista v drug delovni zvezek klonira njegove skupine mini grafikonov skupaj s preostalim listom, kar omogoča preprosto ustvarjanje poročil na podlagi predlog: ohranite slogovno oblikovan list predloge, ga kopirate za vsako poročilo in znova usmerite območja
Seznam extLst lahko vsebuje tudi razširitvene bloke, za katere HotXLS nima tipiziranega modela — Excel v isti seznam zapisuje bloke x14 za funkcije, kot so odrezovalniki (slicers) in razširjeno pogojno oblikovanje. Od različice v2.131.0 dalje se ti tuji bloki dobesedno ohranijo skozi povratno potovanje (round-trip), namesto da bi bili zavrženi: razčlenjevalnik jih zajame, jih izpostavi kot samo za branje prek Worksheet.RawWorksheetExts in jih ob shranjevanju zapiše nazaj, prav tako pa potujejo z listom, ko se ta kopira v drug delovni zvezek. Ohranjeni XML se rekonstruira iz dogodkov razčlenjevalnika, zato je semantično enakovreden izvirniku in ne bajtno enak, vendar ga Excel sprejme in funkcije preživijo. Praktična posledica je tista, ki šteje v produkciji: odpiranje strankinega delovnega zvezka in ponovno shranjevanje ne odstrani več razširitev, za katere niste zahtevali, da jih HotXLS razume
Iskrena meja: mini grafikoni se izrišejo v Excelu 2010 in novejših ter v katerem koli drugem bralniku, ki implementira razširitev x14; Excel 2007 prikaže podatke brez grafičnih znakov, kar je degradacija, za katero je bil format zasnovan. Trije tipi mini grafikonov, osem barvnih rež, stikala točk in trije načini osi pokrivajo celotno površino možnosti, ki jih ponuja Excelovo lastno pogovorno okno. Podpora za mini grafikone skupaj s preostalim pogonom XLSX, prikazanim tukaj, se prinaša v komponenti HotXLS Delphi Excel Component za Delphi in C++Builder