Articol tehnic

Editarea graficelor Excel fără pierderea ChartML în HotXLS

HotXLS păstrează ChartML-ul original al unui grafic Excel importat și îl reemite octet cu octet când nimic din modelul tipizat nu s-a schimbat, astfel încât deschiderea și resalvarea unui registru de lucru nu dezbracă tăcut părțile unui grafic pe care modelul de obiecte nu le reprezintă. Editați un titlu, o serie sau o axă, iar HotXLS îmbină structural noile noduri tipizate în arborele original mai degrabă decât să regenereze graficul de la zero

Acea distincție — reemisie când nu este atins, îmbinare când este editat — este ceea ce face o aplicație Delphi sigură de îndreptat spre grafice construite de un analist în Excel. Regenerarea unui grafic dintr-un model tipizat pierde întotdeauna ce nu cunoaște modelul, iar graficele Excel sunt pline de lucruri pe care o bibliotecă nu le cunoaște: stiluri personalizate, liste de extensii, ramuri de conținut alternativ, formatare calificată pe spațiu de nume de la add-in-uri

De ce aplatizează resalvarea unui registru de lucru graficele sale?

Pentru că implementarea obișnuită citește ce înțelege și scrie ce înțelege. Tot ce e între — un extLst de la o construcție Excel mai nouă, o ramură mc:AlternateContent, un efect de formă pentru care modelul nu are proprietate — există în fișier, nu are cămin în modelul de obiecte, iar dispare la salvare. Utilizatorul vede un grafic care și-a pierdut gradientul, etichetele de date personalizate sau efectul 3D, iar registrul de lucru nu poate explica de ce

Cu PreserveUnsupportedParts activat pe registrul de lucru, HotXLS stochează octeții UTF-8 originali ai graficului la import, împreună cu o lungime și o amprentă de 64 de biți a conținutului modelat. Dacă modelul tipizat nu s-a schimbat până la salvare, scrie octeții originali înapoi. Fără reordonare XML, fără derive de spațiu alb, fără o copie UTF-16 rezidentă a graficului prin memorie pentru un grafic pe care nimeni nu l-a editat

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;

Ce păstrează îmbinarea și ce deține modelul

Regula este proprietatea. Nodurile publice de model — titlu, serii, cache-uri, grupuri de trasare, axe — sunt decise de arborele nou generat. Subarborii nemodelați sunt purtați mai departe din original. Acea asimetrie este intenționată, iar este partea care cere un moment să fie internalizată: ștergerea unei serii nu trebuie să învie vechea serie din XML-ul păstrat, așa că orice deține modelul este luat din model chiar când modelul spune „dispărut”

Conținutul fără proprietar este reinserat lângă nodurile potrivite lângă care stătea, iar extLst rămâne ultimul în interiorul părintelui său deoarece acolo cere schema. Ștergerea unei proprietăți cunoscute — eliminarea unui fanion bold, abandonul unei culori — este tratată ca o ștergere, nu ca o lacună de umplut din arborele original. Atributele necunoscute din același cartier își păstrează locul

Conținutul de compatibilitate-markup primește tratament specific. La analiză, HotXLS sare mc:Choice și citește mc:Fallback; dacă acea ramură fallback împachetează un grup de trasare pe care îl cunoaște modelul, îmbinarea scrie noul conținut tipizat înapoi în subarborele fallback. Fără acel pas o salvare ar emite noul grup de trasare și ar lăsa vechiul în interiorul fallback-ului, iar graficul ar purta două

Excluderea unui grafic

ClearPreservedXml abandonează XML-ul original și amprenta pentru un grafic, astfel încât următoarea salvare reconstruiește acel grafic pur din modelul tipizat. Este o decizie per-grafic; PreserveUnsupportedParts la nivel de registru de lucru guvernează încă dacă starea de păstrare este construită la import

Apelați la ea când vreți un grafic curat mai degrabă decât unul fidel — de exemplu când un grafic șablon poartă formatare de la o temă corporativă veche, iar scopul operațiunii este să o eliminați. Nu apelați la ea ca reflex de depanare: un grafic care randează greșit după o editare este mai des o întrebare de modelare decât de păstrare, iar ștergerea XML-ului păstrat distruge dovezi

Grafice combinate și a doua axă

AddPlotGroup construiește grafice combinate ordonate, unde fiecare grup de trasare își păstrează propria familie de grafic și propria atribuire de axă primară sau secundară. Asta este de ce are nevoie ubicuul grafic de afaceri: venitul ca coloane pe axa din stânga, procentul de marjă ca linie pe cea din dreapta

Graficele expun axe primare și secundare de categorie și valoare plus o axă de serii, cu setări tipizate de categorie, valoare, dată și axă-serii acoperind poziții, identificatori, încrucișări, unități de dată, intervale de etichete și vizibilitate. API-ul plat mai vechi — ChartType, AddSeries, colecția plată Series — adresează încă grupul de trasare primar, astfel încât codul existent continuă să funcționeze în timp ce modelul de dedesubt ține fiecare grup ordonat

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;

Înainte să existe acest model, deschiderea și resalvarea unui grafic combinat îl colașa într-o singură familie de grafic și pierdea axele secundare, de dată și de serii. Referințele de formulă de grafic și valorile de serie cache supraviețuiesc acum și copiilor de registru de lucru și ciclurilor de deschidere/salvare, iar ancorele de grafic sunt potrivite cu părțile lor de grafic după identificatorul de relație — astfel încât o aplicație care reordonează intrările de relație nu mai schimbă conținuturi de grafic între poziții de foaie de calcul

Capcana manual layout

Dacă poziționați manual o arie de trasare, un titlu, un titlu de axă sau o legendă, scrieți toate cele patru coordonate. Office cere x, y, w și h ca grup complet ori de câte ori este prezent oricare dintre ele, iar ignoră întregul manualLayout altfel. HotXLS emite întotdeauna dreptunghiul complet din acel motiv, iar SetPositionAndSize îl setează și activează într-un singur apel

Încă două detalii urmează Excel mai degrabă decât latitudinea completă a specificației. Poziția este scrisă cu xMode și yMode setate la edge, în timp ce dimensiunea folosește factor pentru wMode și hMode, deoarece asta scrie Excel și asta în care convertește alte combinații. Iar layoutTarget este emis doar pentru aria de trasare, niciodată pentru titluri sau legende, unde notele de implementare Microsoft îl interzic

Încadrarea acestuia într-un drum dus-întors de registru de lucru

Păstrarea graficelor este o instanță a unei politici generale: o bibliotecă care editează documente autorate în altă parte ar trebui să schimbe ce i s-a cerut să schimbe și nimic altceva. Același raționament conduce HotXLS pe teme, lanțuri de calcul și extensii de foaie de calcul, descris în notele despre drumuri dus-întors fără pierderi pentru temă, extLst și calcChain, iar pe proiecte VBA și legături externe în păstrarea proiectelor VBA și a legăturilor externe. Pentru suprafața de autorie de grafice în sine — crearea de grafice, plasarea imaginilor și a desenelor din Delphi — vedeți prezentarea detaliată despre grafice, imagini și desene în HotXLS

HotXLS citește, editează și scrie grafice XLSX din cod Delphi și C++Builder nativ fără nicio instalare de Excel pe mașină, ceea ce face fidelitatea o problemă de bibliotecă mai degrabă decât de automatizare — pagina componentei de foi de calcul HotXLS are lista de funcții de grafice și o descărcare de probă