HotXLS zachováva pôvodný ChartML importovaného Excel grafu a prehráva ho bajt za bajtom, keď sa v typovanom modeli nič nezmenilo, takže otvorenie a znovuuloženie zošita potichu neodstráni časti grafu, ktoré objektový model nereprezentuje. Upravte titul, sériu alebo os a HotXLS štrukturálne zlúči nové typované uzly do pôvodného stromu namiesto regenerácie grafu od nuly
Toto rozlíšenie — prehrať pri nezmenenom, zlúčiť pri úprave — je to, čo robí Delphi aplikáciu bezpečnou nasmerovať na grafy, ktoré postavil analytik v Exceli. Regenerácia grafu z typovaného modelu vždy stratí to, čo model nepozná, a Excel grafy sú plné vecí, ktoré knižnica nepozná: vlastné štýly, zoznamy rozšírení, vetvy alternatívneho obsahu, formátovanie kvalifikované priestorom názvov z add-inov
Prečo znovuuloženie zošita splošti jeho grafy?
Pretože bežná implementácia číta to, čomu rozumie, a zapisuje to, čomu rozumie. Všetko medzi tým — extLst z novšieho Excel buildu, vetva mc:AlternateContent, efekt tvaru, pre ktorý model nemá vlastnosť — existuje v súbore, nemá miesto v objektovom modeli a pri ukladaní zmizne. Používateľ vidí graf, ktorý stratil svoj prechod, vlastné dátové štítky alebo 3D efekt, a zošit nedokáže vysvetliť prečo
S zapnutým PreserveUnsupportedParts na zošite HotXLS ukladá pôvodné UTF-8 bajty grafu pri importe spolu s dĺžkou a 64-bitovým odtlačkom modelovaného obsahu. Ak sa typovaný model do času ukladania nezmenil, zapíše pôvodné bajty späť. Žiadne poradie XML, žiadny drift bielych znakov, žiadna rezidentná UTF-16 kópia grafu visiaca v pamäti pre graf, ktorý nikto neupravoval
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;
Čo zlučovanie zachováva a čo vlastní model
Pravidlom je vlastníctvo. Verejné uzly modelu — titul, série, caches, skupiny vykreslenia, osi — sa rozhodujú z novovygenerovaného stromu. Nemodelované podstromy sa prenášajú z pôvodného. Táto asymetria je zámerne a je to časť, ktorú chvíľu trvá internalizovať: zmazanie série nesmie vzkriesiť starú sériu z preserved XML, takže čokoľvek, čo model vlastní, sa berie z modelu aj vtedy, keď model hovorí „preč"
Nevlastnený obsah sa vloží späť vedľa zodpovedajúcich uzlov, pri ktorých sedel, a extLst zostáva posledný vnútri svojho rodiča, pretože tam ho vyžaduje schéma. Vymazanie známej vlastnosti — odstránenie príznaku tučného písma, zrušenie farby — sa považuje za vymazanie a nie za medzeru, ktorú treba vyplniť z pôvodného stromu. Neznáme atribúty v rovnakom susedstve si držia svoje miesto
Markup-compatibility obsah dostáva špecifické zaobchádzanie. Pri parsovaní HotXLS preskakuje mc:Choice a číta mc:Fallback; ak táto fallback vetva obaľuje skupinu vykreslenia, ktorú model pozná, zlučovanie zapíše nový typovaný obsah späť do podstromu fallback. Bez tohto kroku by uloženie emitovalo novú skupinu vykreslenia a nechalo starú vnútri fallbacku, a graf by niesol dve
Vyradenie jedného grafu
ClearPreservedXml zahadzuje pôvodné XML a odtlačok pre jeden graf, takže ďalšie uloženie prestaví tento graf čisto z typovaného modelu. Je to rozhodnutie pre jeden graf; úroveň zošita PreserveUnsupportedParts stále riadi, či sa stav zachovania buduje pri importe
Siahnite po ňom, keď chcete čistý graf a nie verný — napríklad keď šablónový graf nesie formátovanie zo starej firemnej témy a zmyslom operácie je ho zahodiť. Nesiahajte po ňom ako debug reflex: graf, ktorý sa po úprave renderuje zle, je častejšie otázkou modelovania než otázkou zachovania a vymazanie preserved XML ničí dôkaz
Kombinované grafy a druhá os
AddPlotGroup stavia usporiadané kombinované grafy, kde každá skupina vykreslenia drží svoju vlastnú čeľad grafu a svoje vlastné priradenie primárnej alebo sekundárnej osi. To je to, čo potrebuje všadeprítomný obchodný graf: tržby ako stĺpce na ľavej osi, marža v percentách ako čiara na pravej
Grafy vystavujú primárne a sekundárne osi kategórií a hodnôt plus sériovú os, s typovanými nastaveniami kategórie, hodnoty, dátumu a série pokrývajúcimi pozície, identifikátory, kríženia, dátumové jednotky, interwały štítkov a viditeľnosť. Staršie ploché API — ChartType, AddSeries, plochá kolekcia Series — stále adresuje primárnu skupinu vykreslenia, takže existujúci kód naďalej funguje, kým model pod ním drží každú usporiadanú skupinu
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;
Predtým, než tento model existoval, otvorenie a znovuuloženie kombinovaného grafu ho zrazilo do jednej čeľade grafu a stratilo sekundárne, dátumové a sériové osi. Referencie grafových formulí a cachované hodnoty sérií teraz prežijú kópie zošita a cykly open/rovnako, a ukotvenia grafov sa spájajú s ich grafmičasťami podľa identifikátora vzťahu — takže aplikácia, ktorá mení poradie položiek vzťahov, už nevymieňa obsah grafov medzi pozíciami hárkov
Pasca manuálneho rozvrhnutia
Ak ručne pozicujete plochu vykreslenia, titul, os titulu alebo legendu, zapíšte všetky štyri súradnice. Office vyžaduje x, y, w a h ako úplnú skupinu vždy, keď je prítomný aspoň jeden z nich, a inak ignoruje celé manualLayout. HotXLS z toho dôvodu vždy emituje plný obdĺžnik a SetPositionAndSize ho nastaví a povoľuje jedným volaním
Dva ďalšie detaily sledujú Excel a nie plnú voľnosť špecifikácie. Pozícia sa zapisuje s xMode a yMode nastavenými na edge, zatiaľ čo veľkosť používa factor pre wMode a hMode, pretože to je to, čo zapisuje Excel a do čoho konvertuje ostatné kombinácie. A layoutTarget sa emituje iba pre plochu vykreslenia, nikdy pre tituly alebo legendy, kde to poznámky k implementácii Microsoft zakazujú
Zaradenie do okruhu zošita
Zachovanie grafov je jedna inštancia všeobecnej politiky: knižnica, ktorá upravuje dokumenty autorované inde, by mala zmeniť to, o čo bola požiadaná, a nič iné. Rovnaké uvažovanie poháňa HotXLS pri témach, reťazcoch výpočtov a rozšíreniach pracovných hárkov, popísané v poznámkach k bezstratovým okruhom pre tému, extLst a calcChain a pri VBA projektoch a externých prepojeniach v zachovávaní VBA a externých prepojení. Pre samotnú plochu autorovania grafov — vytváranie grafov, umiestňovanie obrázkov a kresieb z Delphi — pozri návod k grafom, obrázkom a kresbám v HotXLS
HotXLS číta, upravuje a zapisuje XLSX grafy z natívneho Delphi a C++Builder kódu bez inštalácie Excelu na stroji, čo je to, čo robí z vernosti problém knižnice a nie problém automatizácie — stránka HotXLS spreadsheet komponentu obsahuje zoznam grafových funkcií a skúšobnú stiahnutie