HotXLS beholder den opprinnelige ChartML-en til et importert Excel-diagram og spiller den av byte for byte når ingenting i den typede modellen endret seg, slik at å åpne og lagre en arbeidsbok på nytt ikke stille stripper de delene av et diagram objektmodellen ikke representerer. Rediger en tittel, en serie eller en akse og HotXLS fletter strukturelt de nye typede nodene inn i det opprinnelige treet snarere enn å regenerere diagrammet fra bunnen av
Den forskjellen — avspilling når urørt, sammenslåing når redigert — er det som gjør en Delphi-applikasjon trygg å peke mot diagrammer en analytiker bygde i Excel. Å regenerere et diagram fra en typet modell taper alltid det modellen ikke vet om, og Excel-diagrammer er fulle av ting et bibliotek ikke vet om: egendefinerte stiler, utvidelseslister, alternativ-innhold-grener, navneroms-kvalifisert formatering fra tillegg
Hvorfor flater lagring-på-nytt ut en arbeidsboks diagrammer?
Fordi den vanlige implementasjonen leser det den forstår og skriver det den forstår. Alt i mellom — en extLst fra en nyere Excel-bygg, en mc:AlternateContent-gren, en formeffekt modellen ikke har noen egenskap for — finnes i filen, har ingen plass i objektmodellen, og forsvinner ved lagring. Brukeren ser et diagram som mistet sin gradient, sine egendefinerte dataetiketter eller sin 3D-effekt, og arbeidsboken kan ikke forklare hvorfor
Med PreserveUnsupportedParts aktivert på arbeidsboken lagrer HotXLS de opprinnelige UTF-8-diagram-bytene ved import sammen med en lengde og et 64-bits fingeravtrykk av det modellerte innholdet. Hvis den typede modellen ikke har endret seg ved lagringstidspunkt, skriver den de opprinnelige bytene tilbake. Ingen XML-omordnet, ingen blanktegn-avdrift, ingen resident UTF-16-kopi av diagrammet hengende rundt i minnet for et diagram ingen redigerte
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;
Hva sammenslåingen beholder og hva modellen eier
Regelen er eierskap. Offentlige modellnoder — tittel, serier, mellomlagre, plott-grupper, akser — avgjøres av det nylig genererte treet. Umodellerte undertrær føres over fra det opprinnelige. Den asymmetrien er bevisst, og det er den delen det tar et øyeblikk å internalisere: å slette en serie må ikke gjenopplive den gamle serien fra den bevarte XML-en, så alt modellen eier tas fra modellen selv når modellen sier «borte»
Innhold uten eier settes inn på nytt ved siden av de samsvarende nodene det lå ved siden av, og extLst forblir sist innen sin forelder fordi det er der skjemaet krever det. Å tømme en kjent egenskap — fjerne et fet-flagg, droppe en farge — behandles som en tømming, ikke som et hull som skal fylles fra det opprinnelige treet. Ukjente attributter i det samme nabolaget beholder sin plass
Markup-compatibility-innhold får spesifikk håndtering. Ved parsing hopper HotXLS over mc:Choice og leser mc:Fallback; hvis den reservegrenen omslutter en plott-gruppe modellen kjenner, skriver sammenslåingen det nye typede innholdet tilbake inn i reserven-underreet. Uten det steget ville en lagring sende ut den nye plott-gruppen og etterlate den gamle inne i reserven, og diagrammet ville bære to
Å melde ett diagram ut
ClearPreservedXml slipper den opprinnelige XML-en og fingeravtrykket for ett diagram, slik at neste lagring bygger det diagrammet rent fra den typede modellen. Det er en per-diagram-beslutning; arbeidsbok-nivå PreserveUnsupportedParts styrer fortsatt om bevaringstilstand bygges ved import
Grip etter det når du vil ha et rent diagram snarere enn et trofast — for eksempel når et mal-diagram bærer formatering fra et gammelt firma-tema og poenget med operasjonen er å forkaste det. Ikke grip etter det som en feilsøkingsrefleks: et diagram som renderer feil etter en redigering er oftere et modellerings-spørsmål enn et bevarings-spørsmål, og å tømme den bevarte XML-en ødelegger bevisene
Kombinasjonsdiagrammer og den andre aksen
AddPlotGroup bygger ordnede kombinasjonsdiagrammer, der hver plott-gruppe beholder sin egen diagram-familie og sin egen primær- eller sekundær-akse-tilordning. Det er hva det allestedsnærværende forretningsdiagrammet trenger: omsetning som kolonner på venstre akse, marginprosent som en linje på høyre
Diagrammer eksponerer primære og sekundære kategori- og verdi-akser pluss en serie-akse, med typede kategori-, verdi-, dato- og serie-akse-innstillinger som dekker posisjoner, identifikatorer, kryssinger, datoenheter, etikett-intervaller og synlighet. Det eldre flate API-et — ChartType, AddSeries, den flate Series-samlingen — adresserer fortsatt den primære plott-gruppen, slik at eksisterende kode fortsetter å virke mens modellen under holder hver ordnet gruppe
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;
Før denne modellen eksisterte, kollapset åpning og lagring på nytt av et kombinasjonsdiagram det til én diagram-familie og mistet de sekundære, dato- og serie-aksene. Diagram-formel-referanser og mellomlagrede serie-verdier overlever nå arbeidsbok-kopier og åpne/lagre-sykluser også, og diagram-ankre matches til sine diagram-deler etter relasjonsidentifikator — slik at en applikasjon som omordner relasjonsoppføringer ikke lenger bytter diagram-innhold mellom regneark-posisjoner
Den manuelle layout-fellen
Hvis du posisjonerer et plott-område, en tittel, en akse-tittel eller en forklaring for hånd, skriv alle fire koordinatene. Office krever x, y, w og h som en komplett gruppe når en hvem som helst av dem er til stede, og ignorerer hele manualLayout ellers. HotXLS sender alltid ut det fulle rektangelet av den grunn, og SetPositionAndSize setter og aktiverer det i ett kall
To detaljer til følger Excel snarere enn spesifikasjonens fulle frihet. Posisjon skrives med xMode og yMode satt til edge mens størrelse bruker factor for wMode og hMode, fordi det er det Excel skriver og det det konverterer andre kombinasjoner til. Og layoutTarget sendes kun ut for plott-området, aldri for titler eller forklaringer, der Microsofts implementasjonsnotater forbyr det
Å passe dette inn i en arbeidsbok-rundtur
Diagram-bevaring er én instans av en generell policy: et bibliotek som redigerer dokumenter forfattet andre steder bør endre det det ble bedt om å endre og ingenting annet. Den samme resonnementet driver HotXLS på temaer, beregningskjeder og regneark-utvidelser, beskrevet i notatene om tapsfrie rundturer for tema, extLst og calcChain, og om VBA-prosjekter og eksterne lenker i bevaring av VBA og eksterne lenker. For diagram-forfatter-flaten selv — opprette diagrammer, plassere bilder og tegninger fra Delphi — se gjennomgangen av diagrammer, bilder og tegninger i HotXLS
HotXLS leser, redigerer og skriver XLSX-diagrammer fra ren Delphi- og C++Builder-kode uten Excel-installasjon på maskinen, noe som er det som gjør trofasthet til et biblioteksproblem snarere enn et automasjonsproblem — HotXLS-regnearkkomponentsiden har diagram-funksjonslisten og en prøvenedlasting