HotXLS išlaiko importuotos Excel diagramos originalų ChartML ir atkartoja jį baitas į baitą, kai tipizuotame modelyje nieko nepasikeitė, todėl knygos atvėrimas ir pakartotinis išsaugojimas tyliai nenuima tų diagramos dalių, kurių objektų modelis neatvaizduoja. Redaguokite pavadinimą, seką ar ašį, ir HotXLS struktūriškai sulieja naujus tipizuotus mazgus į originalų medį, užuot regeneravęs diagramą iš nulio
Šis skirtumas — atkūrimas, kai nepaliesta, ir suliejimas, kai redaguota — ir leidžia Delphi programą saugiai nukreipti į diagramas, kurias analitikas statė Excel. Diagramos regeneravimas iš tipizuoto modelio visada praranda tai, ko modelis nežino, o Excel diagramos pilnos dalykų, kurių biblioteka nežino: pasirinktinių stilių, plėtinių sąrašų, alternatyvaus turinio šakų, vardų erdvės apibrėžto formatavimo iš priedų
Kodėl pakartotinis knygos išsaugojimas plokština jos diagramas?
Nes įprastas įgyvendinimas skaito, ką supranta, ir rašo, ką supranta. Viskas tarp — extLst iš naujesnės Excel versijos, mc:AlternateContent šaka, formos efektas, kuriam modelis neturi savybės — egzistuoja faile, neturi namų objektų modelyje ir dingsta išsaugojimo metu. Naudotojas mato diagramą, praradusią savo gradientą, pasirinktinius duomenų etiketes ar 3D efektą, o knyga negali paaiškinti kodėl
Su PreserveUnsupportedParts, įjungtu knygoje, HotXLS saugoja originalius UTF-8 diagramos baitus importuojant su ilgiu ir 64 bitų modeliuoto turinio pirštų atspaudų. Jei tipizuotas modelis iki išsaugojimo nepasikeitė, jis užrašo originalius baitus atgal. Jokio XML pertvarkymo, jokio tarpų nuokrypio, jokios nuolatinės UTF-16 diagramos kopijos atmintyje diagramai, kurios niekas neredagavo
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;
Ką suliejimas išlaiko ir ką valdo modelis
Taisyklė yra nuosavybė. Viešieji modelio mazgai — pavadinimas, sekos, podėliai, braižymo grupės, ašys — sprendžiami pagal naujai sugeneruotą medį. Nemodeliuoti pomedžiai perkeliami iš originalo. Ta asimetrija sąmoninga, ir tai dalis, kuriai reikia akimirkos įsisavinti: sekos ištrynimas neturi prikelti senos sekos iš išsaugoto XML, todėl viskas, ką valdo modelis, imama iš modelio, net kai modelis sako „dingo“
Nepriklausančio turinio įterpiamas šalia sutampančių mazgų, prie kurių jis sėdėjo, o extLst lieka paskutinis savo tėvo viduje, nes ten reikalauja schema. Žinomos savybės išvalymas — paryškinimo vėliavėlės pašalinimas, spalvos išmetimas — traktuojamas kaip išvalymas, o ne kaip tarpas, kurį reikia užpildyti iš originalaus medžio. Nežinomi atributai toje pačioje kaimynystėje išlaiko savo vietą
Žymėjimo suderinamumo turinys gauna specifinį apdorojimą. Analizuojant HotXLS praleidžia mc:Choice ir skaito mc:Fallback; jei ta atsarginė šaka apgaubia braižymo grupę, kurią modelis pažįsta, suliejimas užrašo naują tipizuotą turinį atgal į atsarginės šakos pomedį. Be to žingsnio išsaugojimas išspausdintų naują braižymo grupę ir paliktų senąją atsarginės šakos viduje, ir diagrama neštų dvi
Vienos diagramos išjungimas
ClearPreservedXml išmeta originalų XML ir pirštų atspaudą vienai diagramai, todėl kitas išsaugojimas stato tą diagramą iš naujo tik iš tipizuoto modelio. Tai sprendimas vienai diagramai; knygos lygio PreserveUnsupportedParts vis dar valdo, ar išsaugojimo būsena statoma importuojant
Griebkitės jo, kai norite švarios diagramos, o ne ištikimos — pavyzdžiui, kai šablono diagrama neša formatavimą iš senos įmonės temos ir operacijos tikslas yra jį atmesti. Nesityvėkite į jį kaip derinimo refleksą: diagrama, kuri po redagavimo atvaizduojama neteisingai, dažniau yra modeliavimo klausimas, o ne išsaugojimo klausimas, o išsaugoto XML išvalymas sunaikina įrodymus
Derinių diagramos ir antroji ašis
AddPlotGroup stato sunumeruotas derinių diagramas, kur kiekviena braižymo grupė išlaiko savo diagramos šeimą ir savo pirminės ar antrinės ašies priskyrimą. Būtent to reikia visur esančiai verslo diagramai: pajamos kaip stulpeliai kairėje ašyje, maržos procentas kaip linija dešinėje
Diagramos atskleidžia pirmines ir antrines kategorijų bei reikšmių ašis plius sekų ašį, su tipizuotais kategorijos, reikšmės, datos ir sekų ašies nustatymais, padengiančiais pozicijas, identifikatorius, susikirtimus, datų vienetus, etikečių intervalus ir matomumą. Senesnis plokščias API — ChartType, AddSeries, plokščia Series kolekcija — vis dar adresuoja pirminę braižymo grupę, todėl esamas kodas veikia, o modelis po juolaiko kiekvieną sunumeruotą grupę
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;
Kol šio modelio nebuvo, derinių diagramos atvėrimas ir pakartotinis išsaugojimas sugriaudavo ją į vieną diagramos šeimą ir prarasdavo antrines, datos ir sekų ašis. Diagramų formulės nuorodos ir podėlio sekų reikšmės dabar išgyvena knygų kopijas ir atvėrimo bei išsaugojimo ciklus, o diagramų inkarai sutikdinami su jų diagramų dalimis pagal ryšioidentifikatorių — taigi programa, pertvarkanti ryšių įrašus, nebesukeičia diagramų turinio tarp darbalapių pozicijų
Rankinio išdėstymo spąstai
Jei rankiniu būdu pozicionuojate braižymo sritį, pavadinimą, ašies pavadinimą ar legendą, užrašykite visas keturias koordinates. Office reikalauja x, y, w ir h kaip baigtos grupės, kai tik vienas iš jų yra, ir ignoruoja visą manualLayout kitu atveju. HotXLS visada išspausdina pilną stačiakampį dėl tos priežasties, o SetPositionAndSize nustato ir įjungia jį vienu kvietimu
Dvi kitos detalės seka Excel, o ne specifikacijos pilną laisvę. Pozicija užrašoma su xMode ir yMode, nustatytais į edge, o dydis naudoja factor wMode ir hMode, nes tai rašo Excel ir į ką ji konvertuoja kitus derinius. Ir layoutTarget išspausdinamas tik braižymo sričiai, niekada pavadinimams ar legendoms, kur Microsoft diegimo pastabos draudžia
Įtaisymas į knygos kelionę ten ir atgal
Diagramų išsaugojimas yra vienas bendros politikos atvejis: biblioteka, redaguojanti kitur sukurtus dokumentus, turėtų keisti tai, ko prašyta, ir nieko daugiau. Tas pats samprotavimas veda HotXLS temose, skaičiavimo grandinėse ir darbalapių plėtiniuose, aprašytas nuostolingų kelionių ten ir atgal temai, extLst ir calcChain pastabose, ir VBA projektuose bei išorinėse nuorodose — VBA ir išorinių nuorodų išsaugojime. Dėl paties diagramų autoravimo paviršiaus — diagramų kūrimo, paveikslų ir piešinių dėjimo iš Delphi — žr. diagramų, paveikslų ir piešinių HotXLS aprašymą
HotXLS skaito, redaguoja ir rašo XLSX diagramas iš natyvaus Delphi ir C++Builder kodo be Excel diegimo kompiuteryje, kas ir padaro tikrumą bibliotekos problema, o ne automatizavimo problema — HotXLS skaičiuoklės komponento puslapyje yra diagramų savybių sąrašas ir bandomoji versija