HotXLS opretter Excel-sparklines — de minidiagrammer, Excel tegner inde i en enkelt celle — fra Delphi og C++Builder med et enkelt kald: TXLSXWorksheet.AddSparklineGroup bygger en sparkline-gruppe over et dataområde, og når projektmappen gemmes, skrives den som en x14-udvidelsesblok inde i regnearkets extLst, som Excel 2010 og nyere renderer, og ældre læsere springer over uden klager. Ingen diagramobjekter, ingen tegningsdele, ingen forankringer
Scenariet, der gør sparklines værd at have, is altid det samme. En dashboard-projektmappe indeholder et par hundrede rækker, én pr. produkt, region eller konto, med tolv månedlige tal hver, og nogen ønsker et trend-symbol for enden af hver række. Modellerer du det med rigtige diagrammer, opretter du hundredvis af DrawingML-diagramdele, hver med sin egen XML-del, relation og forankringsgeometri, for slet ikke at tale om, hvad det gør ved filstørrelse og åbningstid. En sparkline-gruppe is én XML-blok, der siger "tegn en lille linje fra B2:M2 ind i N2, og fra B3:M3 ind i N3," gentaget billigt for så mange rækker, du har
Hvorfor er sparklines en x14-udvidelse i stedet for et diagram?
Sparklines kom med Excel 2010, tre år efter at ECMA-376-baseskemaet var frosset, så de kunne ikke leve i selve regnearkets markup uden at ødelægge enhver eksisterende læser. Microsofts svar er mekanismen med udvidelseslister: Et regneark kan ende med et <extLst>-element, der indeholder <ext>-blokke, hver tagget med en URI, der identificerer funktionen ([MS-XLSX] §2.3.6). Sparklines bruger URI'en {05C60535-1F16-4fd2-B633-F4F36F0B64E0} og x14-navnerummet. En læser, der genkender GUID'en, fortolker blokken; en læser, der ikke gør, skal springe den over. Det er hele historien om fremadrettet kompatibilitet, og det er grunden til, at Excel 2007 åbner en sparkline-projektmappe rent — den viser simpelthen kildetallene uden symbolerne
Én detalje ved mekanismen er værd at fremhæve, fordi den modsiger en almindelig antagelse: Der kræves ingen mc:Ignorable-erklæring på regnearkets rod. Udvidelsens GUID-port er tilstrækkelig i sig selv, og Excels egen skriver erklærer x14-navnerummet lokalt på <ext>-elementet i stedet for at røre ved roden. HotXLS følger det samme mønster, hvilket efterlader resten af regnearkets XML uberørt. Dette er også den strukturelle forskel fra rigtige diagrammer: Et diagram er en separat DrawingML-del med sin egen renderings-pipeline, dækket i den ledsagende artikel om diagrammer, billeder og tegninger, mens en sparkline er regnearkets metadata, som selve regnearksgitteret maler
Hvordan tilføjer du sparklines to en XLSX-fil programmatisk?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) er et-kald-stien: Den opretter en gruppe af den givne type, sår den med Excels standard-seriefarve og tilføjer den første sparkline, der kortlægger et ark-kvalificeret kildeområde til en værtscelle. Den returnerede TXLSXSparklineGroup accepterer derefter flere sparklines via sin Add-metode, ét F/Sqref-par pr. række, som alle deler gruppens type og formatering. For dashboard-tilfældet er det præcis den form, du ønsker: Én gruppe, ét sæt visuelle indstillinger, hundredvis af medlemmer
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 dækker de tre slags, Excel tilbyder: xlsxSparklineLine for trendlinjer, xlsxSparklineColumn for små søjlediagrammer og xlsxSparklineStacked for win/loss-strimler, hvor hver værdi gengives som en op- eller ned-blok. Hver enkelt medlems-sparkline er blot to strenge — F, det ark-kvalificerede kildeområde, og Sqref, cellen symbolerne tegnes i — så der er intet andet at konfigurere pr. række. Grupper kan også bygges helt i hånden via Worksheet.SparklineGroups-samlingen, når du vil starte fra en tom gruppe i stedet for den såede standard
Markører, farveslots og akse-skalering på den typede model
TXLSXSparklineGroup eksponerer det fulde sæt af indstillinger fra Excels bånd Sparkline-værktøjer som almindelige egenskaber. Seks boolske til/fra-knapper fremhæver datapunkter: Markers for hvert punkt på en linjesparkline, plus HighPoint, LowPoint, NegativePoints, FirstPoint og LastPoint. Otte ARGB-farveslots parres med dem — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — med den konvention, at et slot, der efterlades på 0, udelades fra filen, og Excel anvender sin egen standard. Den samme fuldt uigennemsigtige ARGB-form optræder i hele biblioteket, så $FFD00000 her betyder den samme røde farve, som den gør i betingede formateringsstile
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;
Akse-egenskaberne fortjener en overvejelse, før du accepterer standarderne. MinAxisType og MaxAxisType tager hver især individuel, gruppe- eller brugerdefineret skalering: Individuel strækker hver sparkline til sit eget min og max, hvilket får en række, der vipper mellem 99 og 101, til at se lige så dramatisk ud som en række, der tredobles. Gruppeskalering placerer alle medlemmer på én fælles lodret skala, så symbolhøjden betyder den samme mængde i hver række — normalt det, et sammenlignende dashboard ønsker. DisplayEmptyCellsAs bestemmer, hvad en tom kildecelle gør ved en linje: efterlade et hul, tælle som nul eller spænde over hullet ved at forbinde dens naboer
Hvad HotXLS skriver i regnearkets extLst ved gemning
Ved gemning serialiserer HotXLS hver gruppe som et x14:sparklineGroup-element, der bærer type- og skifteattributter, farveslottene som underelementer og en x14:sparklines-liste, hvis medlemmer parrer en xm:f-områdeformel med en xm:sqref-værtscelle. Hele strukturen sidder inde i <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> i slutningen af regnearksdelen, med x14-navnerummet erklæret direkte på blokken, præcis som Excel skriver det. Et regneark uden sparkline-grupper udsender slet ingen extLst, så filer, der aldrig har brugt funktionen, kommer ud byte-for-byte identiske med, hvad tidligere HotXLS-versioner producerede — den samme konservative skriver-disciplin beskrevet i artiklen om tabsfri round-trip-infrastruktur
Én specifikationsdetalje betyder noget, hvis du nogensinde sammenligner output med Excels eller kontrollerer XML'en i hånden: Skemaets standard for lineWeight is 0.75 punkter, ikke de 1.25, som visse sekundære kilder citerer — [MS-XLSX] definerer CT_SparklineGroup@lineWeight med en standard på 0.75, hvilket matcher den vægt, Excels UI faktisk anvender. HotXLS respekterer standarden ved udeladelse: Indstil LineWeight til alt andet end 0.75, og attributten skrives; efterlad den på 0.75, og den gør ikke. Hvis man tager fejl af dette i den ene eller den anden retning, producerer det filer, der renderer en smule tungere eller lettere end den samme projektmappe gemt fra Excel
Round-trips, arkkopiering og udvidelser, HotXLS ikke modellerer
Åbning er spejlbilledet af at gemme. Når HotXLS åbner en projektmappe, der indeholder sparklines — uanset om HotXLS har skrevet den, eller Excel gjorde det — gateway'er parseren på sparkline ext GUID'en og genopbygger hver gruppe, hvert medlem, hver farve og hver akseindstilling i den typede model, så en åbn→rediger→gem-cyklus bevarer dem fuldstændigt. Kopiering af et regneark til en anden projektmappe kloner dets sparkline-grupper sammen med resten af arket, hvilket gør skabelonstyret rapportgenerering ligetil: Hold et skabelonark, kopier det pr. rapport, og peg områderne om
extLst kan også indeholde udvidelsesblokke, som HotXLS ikke har nogen typet model for — Excel skriver x14-blokke for funktioner som udsnit (slicers) og udvidet betinget formatering i den samme liste. Siden v2.131.0 er disse fremmede blokke bevaret ordret på tværs af en round-trip frem for at blive smidt væk: Parseren fanger dem, eksponerer dem som skrivebeskyttede via Worksheet.RawWorksheetExts, og skriver them back on save, and they travel with a sheet when it is copied to another workbook. Den bevarede XML rekonstrueres fra parser-begivenheder, så den er semantisk ækvivalent med den oprindelige snarere end byte-identisk, men Excel accepterer den, og funktionerne overlever. Den praktiske konsekvens er den, der betyder noget i produktionen: Åbning af en kundes projektmappe og gen-gemning af den fjerner ikke længere udvidelser, du ikke bad HotXLS om at forstå
Den ærlige grænselinje: sparklines renderer i Excel 2010 og nyere, samt i enhver anden læser, der implementerer x14-udvidelsen; Excel 2007 viser data uden symbolerne, hvilket er den forringelse, formatet var designet til at have. De three sparkline-typer, de otte farveslots, punkt-til/fra-knapperne og de tre aksetilstande dækker den fulde indstillingsflade, som Excels egen dialogboks tilbyder. Sparkline-understøttelse, sammen med resten af XLSX-motoren vist her, leveres i HotXLS Delphi Excel Component til Delphi og C++Builder