HotXLS stvara Excel mini grafikone (sparklines) — sićušne grafikone koje Excel crta unutar jedne ćelije — iz Delphija i C++Builder-a jednim pozivom: TXLSXWorksheet.AddSparklineGroup gradi grupu mini grafikona preko raspona podataka, a spremanje radne knjige zapisuje je kao blok proširenja x14 unutar extLst radnog lista, koji Excel 2010 i noviji iscrtavaju, a stariji čitači preskaču bez pritužbi. Bez objekata grafikona, bez dijelova za crtanje, bez sidara
Scenarij zbog kojeg vrijedi imati mini grafikone uvijek je isti. Nadzorna radna knjiga (dashboard) nosi nekoliko stotina redaka, jedan po proizvodu ili regiji ili računu, svaki s dvanaest mjesečnih brojki, a netko želi glif trenda na kraju svakog retka. Modelirajte to sa stvarnim grafikonima i stvorit ćete stotine DrawingML dijelova grafikona, svaki sa svojim XML dijelom, odnosom i geometrijom sidrenja, a da ne govorimo o tome što to čini 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, te od B3:M3 u N3', što se jeftino ponavlja za onoliko redaka koliko imate
Zašto su mini grafikoni proširenje x14 umjesto grafikona?
Mini grafikoni su stigli s Excelom 2010, tri godine nakon što je osnovna shema ECMA-376 zamrznuta, pa nisu mogli živjeti u samom označavanju radnog lista bez kvarenja svakog postojećeg čitača. Microsoftov odgovor je mehanizam popisa proširenja (extension list): radni list može završiti elementom <extLst> koji drži blokove <ext>, od kojih je svaki označen URI-jem koji identificira značajku ([MS-XLSX] §2.3.6). Mini grafikoni koriste URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} i prostor naziva x14. Čitač koji prepoznaje GUID analizira blok; od čitača koji ga ne prepoznaje zahtijeva se da ga preskoči. To je cijela priča o kompatibilnosti prema naprijed, i zato Excel 2007 čisto otvara radnu knjigu s mini grafikonima — jednostavno prikazuje izvorne brojeve bez glifova
Jedan detalj mehanizma vrijedi istaknuti jer je u suprotnosti s uobičajenom pretpostavkom: na korijenu radnog lista nije potrebna deklaracija mc:Ignorable. Provjera ext GUID-a sama je po sebi dovoljna, a Excelov vlastiti pisac deklarira prostor naziva x14 lokalno na elementu <ext> umjesto diranja korijena. HotXLS slijedi isti obrazac, što ostatak XML-a radnog lista ostavlja netaknutim. To je ujedno i strukturalna razlika od stvarnih grafikona: grafikon je zaseban DrawingML dio s vlastitim cjevovodom za iscrtavanje, što je pokriveno u pratećem članku o grafikonima, slikama i crtežima, dok je mini grafikon metapodatak radnog lista koji sama mreža proračunske tablice crta
Kako programski dodati mini grafikone u XLSX datoteku?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) je put u jednom pozivu: stvara grupu zadanog tipa, postavlja joj Excelovu zadanu boju serije i dodaje prvi mini grafikon mapirajući izvorne podatke s nazivom lista na ćeliju domaćina. Vraćena grupa TXLSXSparklineGroup zatim prihvaća više mini grafikona kroz svoju metodu Add, jedan par F/Sqref po retku, pri čemu svi dijele tip i oblikovanje grupe. Za slučaj nadzorne ploče to je upravo onaj oblik koji želite: jedna grupa, jedan skup vizualnih 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;
TXLSXSparklineType pokriva tri vrste koje Excel nudi: xlsxSparklineLine za linijske trendove, xlsxSparklineColumn za sićušne stupčaste grafikone i xlsxSparklineStacked za win/loss grafikone gdje se svaka vrijednost iscrtava kao blok prema gore ili dolje. Svaki član mini grafikona sastoji se od samo dva niza znakova — F, izvornog raspona s nazivom lista, i Sqref, ćelije u kojoj se crta glif — tako da se na razini pojedinačnog retka više nema što konfigurirati. Grupe se također mogu graditi u potpunosti ručno kroz zbirku Worksheet.SparklineGroups kada želite početi od prazne grupe umjajuci zadanu boju i ostalo
Markeri, utori za boje i skaliranje osi na tipiziranom modelu
TXLSXSparklineGroup izlaže puni skup opcija iz Excelove vrpce Sparkline Tools kao jednostavna svojstva. Šest logičkih (boolean) prekidača naglašava podatkovne točke: Markers za svaku točku na linijskom mini grafikonu, plus HighPoint, LowPoint, NegativePoints, FirstPoint i LastPoint. Osam ARGB utora za boje se uparuje s njima — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — uz konvenciju da se utor ostavljen na 0 izostavlja iz datoteke i Excel primjenjuje vlastitu zadanu vrijednost. Isti potpuno neprozirni ARGB oblik pojavljuje se u cijeloj knjižnici, pa $FFD00000 ovdje znači istu crvenu boju kao i u stilovima uvjetnog 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;
Svojstva osi zaslužuju trenutak razmišljanja prije nego što prihvatite zadane vrijednosti. MinAxisType i MaxAxisType primaju pojedinačno, grupno ili prilagođeno skaliranje: pojedinačno rasteže svaki mini grafikon na vlastiti minimum i maksimum, što čini da redak koji varira između 99 i 101 izgleda dramatično kao i redak koji se utrostručuje. Grupno skaliranje postavlja sve članove na jednu zajedničku vertikalnu ljestvicu, tako da visina glifa označava istu količinu u svakom retku — što je obično ono što komparativna nadzorna ploča želi. DisplayEmptyCellsAs odlučuje što prazna izvorna ćelija čini liniji: ostavlja prazninu, broji je kao nulu ili premošćuje rupu povezivanjem njezinih susjeda
Što HotXLS zapisuje u extLst radnog lista pri spremanju
Pri spremanju, HotXLS serijalizira svaku grupu kao element x14:sparklineGroup koji nosi atribute tipa i prekidača, utore za boje kao podređene elemente te popis x14:sparklines čiji članovi uparuju formulu raspona xm:f s ćelijom domaćina xm:sqref. Cijela struktura nalazi se unutar <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> na kraju dijela radnog lista, s prostorom naziva x14 deklariranim izravno na bloku, točno onako kako Excel to piše. Radni list bez grupa mini grafikona uopće ne emitira extLst, pa datoteke koje nikada nisu koristile tu značajku ispadaju bajt po bajt identične onima koje su proizvele ranije verzije HotXLS-a — ista disciplina konzervativnog pisanja opisana u članku o infrastrukturi povratnog putovanja bez gubitaka
Jedan detalj specifikacije važan je ako ikada uspoređujete izlaz s Excelovim ili ručno provjeravate XML: zadana vrijednost sheme za lineWeight je 0.75 točaka, a ne 1.25 što neki sekundarni izvori navode — [MS-XLSX] definira CT_SparklineGroup@lineWeight sa zadanih 0.75, što odgovara težini koju Excelovo korisničko sučelje zapravo primjenjuje. HotXLS poštuje zadanu vrijednost izostavljanjem: postavite LineWeight na bilo što osim 0.75 i atribut se zapisuje, ostavite ga na 0.75 i ne zapisuje se. Pogreška u bilo kojem smjeru proizvodi datoteke koje se iscrtavaju suptilno teže ili lakše od iste radne knjige spremljene iz Excela
Povratna putovanja, kopije listova i proširenja koja HotXLS ne modelira
Otvaranje je zrcalna slika spremanja. Kada HotXLS otvori radnu knjigu koja nosi mini grafikone — bilo da ih je zapisao HotXLS ili Excel — analizator (parser) se usmjerava prema mini grafikonu ext GUID i ponovno gradi svaku grupu, član, boju i opciju osi u tipizirani model, tako da ih ciklus otvori→uredi→spremi u potpunosti čuva. Kopiranje radnog lista u drugu radnu knjigu klonira njegove grupe mini grafikona zajedno s ostatkom lista, što čini generiranje izvješća vođeno predlošcima jednostavnim: zadržite stilizirani predložak, kopirajte ga po izvješću i ponovno usmjerite raspone
extLst također može sadržavati blokove proširenja za koje HotXLS nema tipizirani model — Excel piše x14 blokove za značajke kao što su rezači (slicers) i prošireno uvjetno oblikovanje u isti popis. Od verzije v2.131.0 ti se strani blokovi čuvaju doslovno kroz cijelo povratno putovanje umjesto da budu odbačeni: parser ih hvata, izlaže ih samo za čitanje kroz Worksheet.RawWorksheetExts i ponovno ih zapisuje pri spremanju, a oni putuju s listom kada se kopira u drugu radnu knjigu. Sačuvani XML rekonstruira se iz događaja parsera, pa je semantički ekvivalentan originalu, a ne bajt po bajt identičan, ali Excel ga prihvaća i značajke preživljavaju. Praktična posljedica je ona koja je važna u produkciji: otvaranje kupčeve radne knjige i ponovno spremanje više ne uklanja proširenja za koja niste tražili da ih HotXLS razumije
Iskrena granica: mini grafikoni se iscrtavaju u Excelu 2010 i novijim verzijama, te u bilo kojem drugom čitaču koji implementira proširenje x14; Excel 2007 prikazuje podatke bez glifova, što je degradacija za koju je format i dizajniran. Tri vrste mini grafikona, osam utora za boje, prekidači točaka i tri načina rada osi pokrivaju cijelu površinu opcija koje nudi Excelov vlastiti dijaloški okvir. Podrška za mini grafikone, zajedno s ostatkom XLSX mehanizma prikazanim ovdje, isporučuje se u HotXLS Delphi Excel komponenti za Delphi i C++Builder