Tehnički članak

Uređivanje Excel grafikona bez gubitka ChartML u HotXLS

HotXLS čuva originalni ChartML uvezenog Excel grafikona i reprodukuje ga bajt po bajt kad se ništa u tipovanom modelu nije promenilo, tako da otvaranje i ponovno snimanje radne sveske ne tiho ne skida delove grafikona koje model objekata ne predstavlja. Uredite naslov, seriju ili osu i HotXLS strukturno spaja nove tipovane čvorove u originalno stablo umesto da regeneriše grafikon iznova

Ta razlika — reprodukovanje kad nije dirano, spajanje kad je uređivano — jeste ono što čini Delphi aplikaciju bezbednom da se uperi na grafikone koje je analitičar izgradio u Excel-u. Regenerisanje grafikona iz tipovanog modela uvek gubi ono što model ne zna, a Excel grafikoni su puni stvari koje biblioteka ne zna: prilagođeni stilovi, liste proširenja, grane alternativnog sadržaja, formatiranje kvalifikovano prostorom imena iz dodataka

Zašto ponovno snimanje radne sveske spljošti njene grafikone?

Zato što uobičajena implementacija čita šta razume i piše šta razume. Sve između — extLst iz novije Excel gradnje, mc:AlternateContent grana, efekat oblika za koji model nema svojstvo — postoji u fajlu, nema dom u modelu objekata, i nestaje pri snimanju. Korisnik vidi grafikon koji je izgubio svoj gradijent, svoje prilagođene oznake podataka ili svoj 3D efekat, a radna sveska ne može objasniti zašto

Sa PreserveUnsupportedParts omogućenim na radnoj svesci, HotXLS čuva originalne UTF-8 bajtove grafikona pri uvozu zajedno sa dužinom i 64-bitnim otiskom modelovanog sadržaja. Ako se tipovani model nije promenio do trenutka snimanja, upisuje originalne bajtove nazad. Bez XML preuređivanja, bez drifta belih prostora, bez rezidentne UTF-16 kopije grafikona koja visi u memoriji za grafikon koji niko nije uređivao

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;

Šta spajanje čuva, a šta model poseduje

Pravilo je vlasništvo. Javni čvorovi modela — naslov, serije, keševi, grupe crteža, ose — se odlučuju iz novoggenerisanog stabla. Nemodelovana podstabla se prenose iz originala. Ta asimetrija je namerna, i to je deo koji treba trenutak da se internalizuje: brisanje serije ne sme vaskrsnuti staru seriju iz očuvanog XML-a, tako da se sve što model poseduje uzima iz modela čak i kad model kaže «nestalo»

Sadržaj bez vlasnika se ponovo umeće pored usklađenih čvorova pored kojih je sedeo, a extLst ostaje poslednji unutar svog roditelja jer tamo šema to zahteva. Čišćenje poznatog svojstva — uklanjanje zastavice bold, odbacivanje boje — tretira se kao čišćenje, a ne kao jaz koji treba popuniti iz originalnog stabla. Nepoznati atributi u istom komšiluku zadržavaju svoje mesto

Sadržaj markup-compatibility dobija specifično rukovanje. Pri parsiranju, HotXLS preskače mc:Choice i čita mc:Fallback; ako ta grana rezervnog puta obavija grupu crteža koju model zna, spajanje upisuje novi tipovani sadržaj nazad u podstablo rezervnog puta. Bez tog koraka snimanje bi emitovalo novu grupu crteža i ostavilo staru unutar rezervnog puta, i grafikon bi nosio dve

Izuzeće jednog grafikona

ClearPreservedXml odbacuje originalni XML i otisak za jedan grafikon, tako da sledeće snimanje ponovo izgrađuje taj grafikon čisto iz tipovanog modela. To je odluka po grafikonu; svojstvo na nivou radne sveske PreserveUnsupportedParts i dalje upravlja da li se stanje očuvavanja gradi pri uvozu

Posegnite za njim kad želite čist grafikon umesto vernog — na primer kad grafikon šablone nosi formatiranje iz stare korporativne teme i poanta operacije jeste odbaciti ga. Ne posežite za njim kao refleksom otklanjanja grešaka: grafikon koji se renderuje pogrešno nakon izmene je češće pitanje modelovanja nego pitanje očuvanja, a čišćenje očuvanog XML-a uništava dokaz

Kombinovani grafikoni i druga osa

AddPlotGroup gradi uređene kombinovane grafikone, gde svaka grupa crteža čuva svoju porodicu grafikona i svoju dodelu primarne ili sekundarne ose. To je ono što svima prisutan poslovni grafikon treba: prihod kao kolone na levoj osi, marža u procentima kao linija na desnoj

Grafikoni izlažu primarne i sekundarne ose kategorija i vrednosti plus osu serija, sa tipovanim podešavanjima kategorije, vrednosti, datuma i ose serija koja pokriva pozicije, identifikatore, ukrštanja, jedinice datuma, intervale oznaka i vidljivost. Stariji ravni API — ChartType, AddSeries, ravna Series kolekcija — i dalje adresira primarnu grupu crteža, tako da postojeći kod nastavlja da radi dok model ispod drži svaku uređenu grupu

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;

Pre nego što je ovaj model postojao, otvaranje i ponovno snimanje kombinovanog grafikona sažimalo bi ga u jednu porodicu grafikona i gubilo sekundarne, datumske i ose serija. Reference formula grafikona i keširane vrednosti serija sada preživljavaju kopije radne sveske i cikluse otvaranja/snimanja jednako tako, a sidrišta grafikona se usklađuju sa svojim delovima grafikona po identifikatoru relacije — tako da aplikacija koja preuređuje unose relacija više ne menja sadržaj grafikona između pozicija radnog lista

Zamka ručnog rasporeda

Ako pozicionirate područje crteža, naslov, naslov ose ili legendu ručno, napišite sve četiri koordinate. Office zahteva x, y, w i h kao kompletnu grupu kad god je bilo koje od njih prisutno, i ignoriše čitav manualLayout inače. HotXLS uvek emituje pun pravougaonik iz tog razloga, a SetPositionAndSize postavlja i omogućava ga u jednom pozivu

Dve dodatne pojedinosti prate Excel a ne punu slobodu specifikacije. Pozicija se piše sa xMode i yMode postavljenim na edge dok veličina koristi factor za wMode i hMode, jer to je ono što Excel piše i u šta pretvara druge kombinacije. I layoutTarget se emituje samo za područje crteža, nikad za naslove ili legende, gde beleške Microsoft implementacije to zabranjuju

Uklapanje ovoga u povratni put radne sveske

Očuvanje grafikona jeste jedna instanca opšte politike: biblioteka koja uređuje dokumente autorisane drugde treba da promeni ono što je zamoljena da promeni i ništa drugo. Isti rezon vođi HotXLS na temama, lancima izračunavanja i proširenjima radnih listova, opisan u beleškama o bezbnednim povratnim putevima za temu, extLst i calcChain, i o VBA projektima i spoljnim vezama u očuvanju VBA i spoljnih veza. Za samu autorsku površinu grafikona — kreiranje grafikona, postavljanje slika i crteža iz Delphi — pogledajte prolaz kroz grafikone, slike i crteže u HotXLS

HotXLS čita, uređuje i piše XLSX grafikone iz nativnog Delphi i C++Builder koda bez instalacije Excel-a na mašini, što je ono što čini vernost problemom biblioteke a ne problemom automatizacije — stranica HotXLS komponente za proračunske tabele ima listu funkcija grafikona i probnu verziju