HotXLS conserva il ChartML originale di un grafico Excel importato e lo riproduce byte per byte quando nulla nel modello tipizzato è cambiato, così aprire e risalvare una cartella di lavoro non smantella silenziosamente le parti di un grafico che il modello a oggetti non rappresenta. Modifica un titolo, una serie o un asse e HotXLS fonde strutturalmente i nuovi nodi tipizzati nell'albero originale anziché rigenerare il grafico da zero
Quella distinzione — riproduci quando non toccato, fondi quando modificato — è ciò che rende sicuro puntare un'applicazione Delphi su grafici che un analista ha costruito in Excel. Rigenerare un grafico da un modello tipizzato perde sempre ciò che il modello non conosce, e i grafici Excel sono pieni di cose che una libreria non conosce: stili personalizzati, liste di estensioni, branch di alternate content, formattazione qualificata da namespace che proviene da componenti aggiuntivi
Perché risalvare una cartella di lavoro appiattisce i suoi grafici?
Perché l'implementazione consueta legge ciò che capisce e scrive ciò che capisce. Tutto ciò che sta in mezzo — una extLst da una build Excel più recente, un branch mc:AlternateContent, un effetto di forma per cui il modello non ha una proprietà — esiste nel file, non ha casa nel modello a oggetti, e scompare al salvataggio. L'utente vede un grafico che ha perso il proprio gradiente, le proprie etichette dati personalizzate o il proprio effetto 3D, e la cartella di lavoro non sa spiegare perché
Con PreserveUnsupportedParts attivato sulla cartella di lavoro, HotXLS archivia i byte UTF-8 originali del grafico all'importazione insieme a una lunghezza e a una fingerprint a 64 bit del contenuto modellato. Se il modello tipizzato non è cambiato entro il salvataggio, riscrive i byte originali. Nessun riordino XML, nessuna deriva di whitespace, nessuna copia UTF-16 residente del grafico in memoria per un grafico che nessuno ha modificato
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;
Cosa conserva il merge e cosa possiede il modello
La regola è la proprietà. I nodi pubblici del modello — titolo, serie, cache, plot group, assi — sono decisi dall'albero appena generato. I sottoalberi non modellati sono riportati dall'originale. Quella asimmetria è deliberata, ed è la parte che richiede un momento per essere interiorizzata: cancellare una serie non deve resuscitare la vecchia serie dal XML preservato, così qualsiasi cosa il modello possiede è presa dal modello anche quando il modello dice «sparita»
Il contenuto non posseduto è reinserito accanto ai nodi con cui combaciava a fianco, e extLst resta ultimo dentro il proprio genitore perché è lì che lo schema lo richiede. Cancellare una proprietà nota — togliere un flag di grassetto, rimuovere un colore — è trattato come cancellazione, non come un vuoto da riempire dall'albero originale. Gli attributi sconosciuti nello stesso intorno conservano il proprio posto
Il contenuto markup-compatibility riceve gestione specifica. In fase di parse, HotXLS salta mc:Choice e legge mc:Fallback; se quel branch di fallback avvolge un plot group che il modello conosce, il merge riscrive il nuovo contenuto tipizzato nel sottoalbero di fallback. Senza quel passo, un salvataggio emetterebbe il nuovo plot group e lascerebbe quello vecchio dentro il fallback, e il grafico ne porterebbe due
Escludere un grafico
ClearPreservedXml droppa il XML originale e la fingerprint per un solo grafico, così il prossimo salvataggio ricostruisce quel grafico puramente dal modello tipizzato. È una decisione per-grafico; il flag a livello di cartella di lavoro PreserveUnsupportedParts continua a governare se lo stato di preservazione viene costruito all'importazione
Raggiungilo quando vuoi un grafico pulito anziché uno fedele — per esempio quando un grafico template porta formattazione da un vecchio tema aziendale e il punto dell'operazione è disfarsene. Non raggiungerlo come riflesso di debug: un grafico che si renderizza male dopo una modifica è più spesso una questione di modellazione che di preservazione, e cancellare il XML preservato distrugge le prove
Grafici combinati e il secondo asse
AddPlotGroup costruisce grafici combinati ordinati, dove ciascun plot group conserva la propria famiglia di grafico e la propria assegnazione di asse primario o secondario. È ciò di cui ha bisogno l'onnipresente grafico aziendale: ricavi come colonne sull'asse sinistro, percentuale di margine come linea sull'asse destro
I grafici espongono assi categoria e valore primari e secondari più un asse serie, con impostazioni tipizzate per categoria, valore, data e asse serie che coprono posizioni, identificatori, intersezioni, unità di data, intervalli di etichetta e visibilità. La vecchia API piatta — ChartType, AddSeries, la collezione piatta Series — continua a indirizzare il plot group primario, così il codice esistente continua a funzionare mentre il modello sotto tiene ogni gruppo ordinato
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;
Prima che questo modello esistesse, aprire e risalvare un grafico combinato lo collassava in un'unica famiglia di grafico e perdeva gli assi secondari, di data e di serie. I riferimenti alle formule di grafico e i valori cached delle serie ora sopravvivono alle copie della cartella di lavoro e ai cicli di apertura/salvataggio, e gli ancoraggi dei grafici sono abbinati alle proprie parti grafico per identificatore di relazione — così un'applicazione che riordina le voci di relazione non scambia più i contenuti dei grafici tra le posizioni dei fogli di lavoro
La trappola del manual layout
Se posizioni a mano l'area del tracciato, il titolo, il titolo dell'asse o la legenda, scrivi tutte e quattro le coordinate. Office richiede x, y, w e h come gruppo completo ogni volta che uno qualsiasi di essi è presente, e ignora l'intero manualLayout in caso contrario. HotXLS emette sempre il rettangolo completo per quel motivo, e SetPositionAndSize lo imposta e lo abilita in una sola chiamata
Altri due dettagli seguono Excel anziché la piena latitudine della specifica. La posizione è scritta con xMode e yMode impostati a edge mentre la dimensione usa factor per wMode e hMode, perché è ciò che Excel scrive e in cui converte le altre combinazioni. E layoutTarget è emesso solo per l'area del tracciato, mai per titoli o leggende, dove le note di implementazione Microsoft lo vietano
Inserire questo in un round trip della cartella di lavoro
La preservazione dei grafici è un'istanza di una policy generale: una libreria che modifica documenti scritti altrove dovrebbe cambiare ciò che le è stato chiesto di cambiare e null'altro. Lo stesso ragionamento guida HotXLS su tema, catene di calcolo ed estensioni dei fogli di lavoro, descritto nelle note sui round trip lossless per tema, extLst e calcChain, e sui progetti VBA e sui collegamenti esterni in preservare VBA e collegamenti esterni. Per la superficie di authoring dei grafici stessa — creare grafici, collocare immagini e disegni da Delphi — vedi la guida sui grafici, immagini e disegni in HotXLS
HotXLS legge, modifica e scrive grafici XLSX da codice Delphi e C++Builder nativo senza alcuna installazione di Excel sulla macchina, il che è ciò che rende la fedeltà un problema di libreria anziché di automazione — la pagina del componente spreadsheet HotXLS ha la lista delle funzionalità dei grafici e un download di prova