Tehnični članak

Urejanje grafov Excel brez izgube ChartML v HotXLS

HotXLS obdrži izvirni ChartML uvoženega grafa Excel in ga ponovi bajt za bajtom, ko se v tipiziranem modelu ni nič spremenilo, tako da odprtje in ponovno shranjevanje delovnega zvezka tiho ne odstrani delov grafa, ki jih model objektov ne predstavlja. Uredite naslov, niz ali os in HotXLS strukturno spoji nove tipizirane vozlišča v izvirno drevo namesto da bi graf znova zgradil iz ničle

Ta razlika — ponovitev, ko je nedotaknjen, spojitev, ko je urejen — je tisto, kar naredi aplikacijo Delphi varno za usmerjanje na grafe, ki jih je v Excelu zgradil analitik. Ponovna gradnja grafa iz tipiziranega modela vedno izgubi vse, česar model ne ve, grafi Excel pa so polni stvari, ki jih knjižnica ne ve: slogi po meri, seznami razširitev, veje nadomestne vsebine, z imenskim prostorom kvalificirano oblikovanje iz dodatkov

Zakaj ponovno shranjevanje delovnega zvezka splošči njegove grafe?

Ker običajna implementacija prebere, kar razume, in zapiše, kar razume. Vse vmes — extLst iz novejše gradnje Excel, veja mc:AlternateContent, učinek oblike, za katerega model nima lastnosti — obstaja v datoteki, nima doma v modelu objektov in ob času shranjevanja izgine. Uporabnik vidi graf, ki je izgubil svoj preliv, svoje oznake podatkov po meri ali svoj učinek 3D, delovni zvezek pa ne more razložiti zakaj

Z PreserveUnsupportedParts, omogočenim na delovnem zvezku, HotXLS ob uvozu shrani izvirne bajte UTF-8 grafa skupaj z dolžino in 64-bitnim prstnim odtisom modelirane vsebine. Če se tipiziran model do časa shranjevanja ni spremenil, zapiše izvirne bajte nazaj. Brez prerazporejanja XML, brez drifta presledkov, brez v pomnilniku prebivajoče kopije UTF-16 grafa, ki bi visela za graf, ki ga nihče ni urejal

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

Kaj spojitev obdrži in česa lastni je model

Pravilo je lastništvo. Javna vozlišča modela — naslov, nizi, predpomnilniki, skupine risanja, osi — so odločena z novo ustvarjenim drevesom. Nemodelirana poddrevesa so prenesena iz izvirnika. Ta asimetričnost je namerna in to je del, ki ga vzame trenutek, da se ga interiorizira: brisanje niza ne sme obuditi starega niza iz ohranjenega XML, zato se vse, kar je v lasti modela, vzame iz modela, tudi ko model pravi "odstranjeno"

Ne-lastništvena vsebina se ponovno vstavi ob primerjana vozlišča, ob katerih je sedela, extLst pa ostane zadnji znotraj svojega starša, ker to zahteva shema. Čiščenje znane lastnosti — odstranitev zastavice krepko, izpustitev barve — se obravnava kot čiščenje in ne kot vrzel, ki jo je treba zapolniti iz izvirnega drevesa. Neznani atributi v isti soseščini obdržijo svoje mesto

Vsebina združljivosti oznak dobi specifično ravnanje. Ob razčlenitvi HotXLS preskoči mc:Choice in prebere mc:Fallback; če ta veja rezervne možnosti ovije skupino risanja, ki jo model pozna, spojitev zapiše novo tipizirano vsebino nazaj v poddrevo rezervne možnosti. Brez tega koraka bi shranjevanje oddalo novo skupino risanja in pustilo staro znotraj rezerve, graf pa bi nosil dve

Izključitev enega grafa

ClearPreservedXml opusti izvirni XML in prstni odtis za enega grafa, tako naslednje shranjevanje ta graf znova zgradi čisto iz tipiziranega modela. To je odločitev na graf; PreserveUnsupportedParts na ravni delovnega zvezka še vedno ureja, ali se stanje ohranjanja gradi ob uvozu

Posežite po njem, ko želite čist graf in ne zvestega — na primer ko grafa predloge nosi oblikovanje iz stare korporativne teme in je smisel operacije odvreči ga. Ne posežite po njem kot refleks razhroščevanja: graf, ki se po urejanju narobe izriše, je pogosteje vprašanje modeliranja kot ohranjanja, čiščenje ohranjenega XML pa uniči dokaze

Kombinirani grafi in druga os

AddPlotGroup gradi urejene kombinirane grafe, kjer vsaka skupina risanja obdrži svojo družino grafa in svojo dodelitev primarne ali sekundarne osi. To je tisto, kar potrebuje povsod prisoten poslovni graf: prihodek kot stolpci na levi osi, marža v odstotkih kot črta na desni

Grafi izpostavljajo primarne in sekundarne kategorične in vrednostne osi ter os nizov, s tipiziranimi nastavitvami kategorije, vrednosti, datuma in osi nizov, ki pokrivajo položaje, identifikatorje, sekane, datumskie enote, intervale oznak in vidnost. Starejši ploski API — ChartType, AddSeries, ploska zbirka Series — še vedno naslavlja primarno skupino risanja, tako obstoječa koda še naprej deluje, medtem ko model pod njo drži vsako urejeno skupino

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

Preden je ta model obstajal, je odprtje in ponovno shranjevanje kombiniranega grafa zružilo v eno družino grafa in izgubilo sekundarne, datumskie in osi nizov. Reference formul grafa in predpomnjene vrednosti nizov zdaj preživijo kopije delovnega zvezka in cikluse odpiranja/shranjevanja, sidrišča grafov pa se primerjajo z njihovimi deli grafa po identifikatorju razmerja — tako aplikacija, ki prerazporedi vnose razmerja, ne zamenja več vsebine grafov med položaji delovnega lista

Past ročne postavitve

Če ročno položite risalno površino, naslov, naslov osi ali legendo, zapišite vse štiri koordinate. Office zahteva x, y, w in h kot popolno skupino, kadarkoli je prisoten katerikoli od njih, sicer pa ignorira celotno manualLayout. HotXLS iz tega razloga vedno izpiše polni pravokotnik, SetPositionAndSize pa ga nastavi in omogoči v enem klicu

Dve podrobnosti še sledita Excelu in ne polni prostosti specifikacije. Položaj se zapiše z xMode in yMode, nastavljenima na edge, medtem ko velikost uporablja factor za wMode in hMode, ker to piše Excel in v kar pretvarja druge kombinacije. In layoutTarget se izpiše le za risalno površino, nikoli za naslove ali legende, kjer opombe implementacije Microsoft to prepovedujejo

Vgradnja tega v povratni klic delovnega zvezka

Ohranjanje grafov je ena pojavitev splošne politike: knjižnica, ki ureja drugje avtorizirane dokumente, bi morala spremeniti tisto, kar je bilo prosila spremeniti, in nič drugega. Enako sklepanje poganja HotXLS pri temah, verigah izračuna in razširitvah delovnih listov, opisano v zapiskih o brezizgubnih povratnih klicih za temo, extLst in calcChain ter o projektih VBA in zunanjih povezavah v ohranjanju VBA in zunanjih povezav. Za samo avtorsko ploskev grafov — ustvarjanje grafov, postavljanje slik in risb iz Delphija — glejte sprehod skozi grafe, slike in risbe v HotXLS

HotXLS bere, ureja in zapisuje grafe XLSX iz izvorne kode Delphi in C++Builder brez namestitve Excel na stroju, kar iz zvestobe naredi težavo knjižnice in ne avtomatizacije — stran komponente preglednic HotXLS ima seznam zmogljivosti grafov in preizkusni prenos