HotXLS creează sparkline-uri Excel — mini-graficele pe care Excel le desenează în interiorul unei singure celule — din Delphi și C++Builder cu un singur apel: TXLSXWorksheet.AddSparklineGroup construiește un grup de sparkline-uri peste un interval de date, iar salvarea registrului de calcul îl scrie ca un bloc de extensie x14 în cadrul listei extLst a foii de calcul, pe care Excel 2010 și versiunile ulterioare le randează, iar cititoarele mai vechi le omit fără nicio avertizare. Fără obiecte de grafic, fără componente de desen, fără ancore
Scenariul care face ca sparkline-urile să fie utile este întotdeauna același. Un registru de calcul de tip tablou de bord (dashboard) conține câteva sute de rânduri, unul pentru fiecare produs, regiune sau cont, având câte douăsprezece cifre lunare, iar cineva dorește un simbol de tendință la sfârșitul fiecărui rând. Dacă modelați acest lucru cu grafice reale, veți crea sute de componente de diagramă DrawingML, fiecare cu propria componentă XML, relație și geometrie de ancorare, ca să nu mai vorbim de impactul asupra dimensiunii fișierului și a timpului de deschidere. Un grup de sparkline-uri este un singur bloc XML care specifică „desenează o linie mică din B2:M2 în N2, și din B3:M3 în N3”, repetat la un cost minim pentru oricâte rânduri aveți
De ce sunt sparkline-urile o extensie x14 în loc de un grafic?
Sparkline-urile au apărut odată cu Excel 2010, la trei ani după ce schema de bază ECMA-376 a fost blocată, deci nu puteau exista în marcajul foii de calcul propriu-zis fără a perturba funcționarea tuturor cititoarelor existente. Soluția oferită de Microsoft este mecanismul listei de extensii: o foaie de calcul se poate termina cu un element <extLst> care conține blocuri <ext>, fiecare etichetat cu un URI ce identifică acea caracteristică ([MS-XLSX] §2.3.6). Sparkline-urile folosesc URI-ul {05C60535-1F16-4fd2-B633-F4F36F0B64E0} și spațiul de nume x14. Un cititor care recunoaște GUID-ul analizează blocul; cel care nu îl recunoaște este obligat să îl omită. Aceasta este întreaga poveste a compatibilității înainte, și de aceea Excel 2007 deschide un registru de calcul cu sparkline-uri fără erori — afișând pur și simplu numerele sursă fără graficele respective
Un detaliu al acestui mecanism merită subliniat deoarece contrazice o ipoteză comună: nu este necesară nicio declarație mc:Ignorable pe rădăcina foii de calcul. Filtrarea prin GUID ext este suficientă în sine, iar instrumentul de scriere din Excel declară spațiul de nume x14 local pe elementul <ext> în loc să modifice rădăcina. HotXLS urmează același model, ceea ce păstrează neatins restul fișierului XML al foii de calcul. Aceasta este, de asemenea, diferența structurală față de graficele reale: un grafic este o parte separată DrawingML cu propria sa conductă de randare, prezentată în articolul însoțitor despre diagrame, imagini și desene, în timp ce un sparkline reprezintă metadate ale foii de calcul pe care grila însăși le desenează
Cum se adaugă programatic sparkline-uri într-un fișier XLSX?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) reprezintă calea simplă de apel: creează un grup de tipul specificat, îl inițializează cu culoarea implicită a seriei din Excel și adaugă prima mapare sparkline din intervalul sursă definit în foaie pe o celulă gazdă. Obiectul returnat TXLSXSparklineGroup acceptă poi mai multe sparkline-uri prin metoda sa Add, câte o pereche F/Sqref pe rând, toate partajând tipul și formatarea grupului. Pentru cazul unui tablou de bord (dashboard), aceasta este exact structura dorită: un singur grup, un set de opțiuni vizuale și sute de membri
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Grp: TXLSXSparklineGroup;
Row: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('dashboard.xlsx');
Sheet := Book.Sheets[0];
// Un singur grup: fiecare rând de produse partajează tipul și formatarea
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 acoperă cele trei tipuri pe care le oferă Excel: xlsxSparklineLine pentru linii de tendință, xlsxSparklineColumn pentru diagrame mici cu bare și xlsxSparklineStacked pentru benzi win/loss în care fiecare valoare este randată ca un bloc în sus sau în jos. Fiecare membru sparkline este format din doar două șiruri de caractere — F, intervalul sursă calificat pentru foaie, și Sqref, celula în care este desenat simbolul — prin urmare nu există nimic altceva de configurat per rând. Grupurile pot fi construite complet manual prin intermediul colecției Worksheet.SparklineGroups atunci când doriți să porniți de la un grup gol în loc de cel implicit
Markere, sloturi de culori și scalarea axelor pe modelul tipizat
TXLSXSparklineGroup expune întregul set de opțiuni din meniul Sparkline Tools al Excel ca proprietăți simple. Șase comutatoare booleene scot în evidență punctele de date: Markers pentru fiecare punct de pe un sparkline de tip linie, plus HighPoint, LowPoint, NegativePoints, FirstPoint și LastPoint. Opt sloturi de culori ARGB sunt asociate cu acestea — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — cu convenția că un slot lăsat la valoarea 0 este omis din fișier, iar Excel își aplică propria culoare implicită. Aceeași formă ARGB complet opacă apare în întreaga bibliotecă, deci $FFD00000 reprezintă aici aceeași culoare roșie ca în stilurile de formatare condiționată
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // lunile cu pierderi ies în evidență
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // o singură scală pentru toate rândurile
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;
Proprietățile axelor merită atenție înainte de a accepta valorile implicite. MinAxisType și MaxAxisType acceptă scalări individuale, de grup sau personalizate: scalarea individuală extinde fiecare sparkline la propriul său minim și maxim, ceea ce face ca un rând ce variază între 99 și 101 să pară la fel de dramatic ca un rând care se triplează. Scalarea de grup plasează toți membrii pe o singură scală verticală comună, astfel încât înălțimea simbolului reprezintă aceeași cantitate pe fiecare rând — ceea ce își dorește de obicei un tablou de bord comparativ. DisplayEmptyCellsAs decide ce efect are o celulă sursă goală asupra unei linii: lasă un spațiu liber, o consideră zero sau acoperă golul prin conectarea vecinilor săi
Ce scrie HotXLS în lista extLst a foii de calcul la salvare
La salvare, HotXLS serializează fiecare grup ca un element x14:sparklineGroup care conține atributele de tip și comutatoarele, sloturile de culori ca elemente fiu și o listă x14:sparklines ai cărei membri asociază o formulă de interval xm:f cu o celulă gazdă xm:sqref. Întreaga structură este plasată în interiorul <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> la sfârșitul foii de calcul, cu spațiul de nume x14 declarat direct pe bloc, exact așa cum scrie Excel. O foaie de calcul fără grupuri de sparkline-uri nu generează deloc secțiunea extLst, astfel încât fișierele care nu au folosit această caracteristică sunt identice octet cu octet cu cele produse de versiunile anterioare ale HotXLS — respectând aceeași disciplină de scriere conservatoare descrisă în articolul despre infrastructura lossless pentru fluxuri bidirecționale
Un detaliu al specificației contează dacă doriți să comparați rezultatul cu cel din Excel sau să verificați manual fișierele XML: lățimea implicită a liniei (lineWeight) în schemă este de 0.75 puncte, nu 1.25 cum citează unele surse secundare — [MS-XLSX] definește CT_SparklineGroup@lineWeight cu o valoare implicită de 0.75, corespunzând grosimii pe care o aplică interfața grafică Excel. HotXLS respectă valoarea implicită prin omitere: dacă setați LineWeight to anything other than 0.75 and the attribute is written, leave it at 0.75 and it is not. Configurarea greșită în oricare direcție produce fișiere care sunt randate cu linii ușor mai groase sau mai subțiri decât cele salvate direct din Excel
Fluxuri bidirecționale, copieri de foi și extensii pe care HotXLS nu le modelează
Deschiderea este imaginea în oglindă a salvării. Când HotXLS deschide un registru de calcul care conține sparkline-uri — fie că a fost scris de HotXLS sau de Excel — parserul filtrează după GUID-ul ext al sparkline-ului și reconstruiește fiecare grup, membru, opțiune de culoare și de axă în modelul tipizat, astfel încât un ciclu deschidere→editare→salvare le conservă în totalitate. Copierea unei foi de calcul într-un alt registru clonează grupurile sale de sparkline-uri împreună cu restul foii, ceea ce face ca generarea de rapoarte bazate pe șabloane să fie simplă: păstrați o foaie șablon stilizată, copiați-o pentru fiecare raport și redefiniți intervalele
Secțiunea extLst poate conține și blocuri de extensie pentru care HotXLS nu are un model tipizat — Excel scrie în aceeași listă blocuri x14 pentru funcții precum slicere sau formatare condiționată extinsă. Începând cu versiunea v2.131.0, aceste blocuri străine sunt păstrate neschimbate (verbatim) în cadrul unui flux bidirecțional, în loc să fie eliminate: parserul le capturează, le expune în mod read-only prin Worksheet.RawWorksheetExts și le scrie la loc la salvare, acestea călătorind împreună cu foaia când este copiată în alt registru de calcul. XML-ul conservat este reconstituit din evenimentele parserului, deci este echivalent semantic cu cel original, chiar dacă nu este identic octet cu octet, dar Excel îl acceptă, iar caracteristicile supraviețuiesc. Consecința practică este cea care contează în producție: deschiderea și resalvarea registrului de calcul al unui client nu mai elimină extensiile pe care nu i-ați cerut bibliotecii HotXLS să le înțeleagă
Limita onestă: sparkline-urile sunt afișate în Excel 2010 și versiunile ulterioare, precum și în orice alt cititor care implementează extensia x14; Excel 2007 afișează datele fără grafice, ceea ce reprezintă degradarea controlată pentru care a fost conceput formatul. Cele trei tipuri de sparkline, cele opt sloturi de culoare, comutatoarele de puncte și cele trei moduri de axe acoperă întreaga gamă de opțiuni pe care le oferă fereastra proprie a Excel. Suportul pentru sparkline, alături de restul motorului XLSX prezentat aici, este inclus în HotXLS Delphi Excel Component pentru Delphi și C++Builder