Tehnički članak

Uređivanje Excel grafikona bez gubitka ChartML-a u HotXLS-u

HotXLS zadržava izvorni ChartML uvezenog Excel grafikona i reproducira ga bajt po bajt kad se ništa u tipkanom modelu nije promijenilo, pa otvaranje i ponovno spremanje radne knjige ne tiho ne uklanja dijelove grafikona koje objektni model ne prikazuje. Uredite naslov, seriju ili os i HotXLS strukturno spaja nove tipkane čvorove u izvorno stablo umjesto da grafikon iznova generira iz početka

Upravo ta razlika, reprodukcija kad je netaknut, spajanje kad je uređen, čini Delphi aplikaciju sigurnom za usmjeravanje na grafikone koje je analitičar izgradio u Excelu. Ponovno generiranje grafikona iz tipkanog modela uvijek gubi ono što model ne zna, a Excelovi grafikoni puni su stvari koje knjižnica ne zna: prilagođeni stilovi, popisi proširenja, grane alternativnog sadržaja, formatiranje kvalificirano prostorom imena iz dodataka

Zašto ponovno spremanje radne knjige spljošti svoje grafikone?

Zato što uobičajena implementacija čita što razumije i zapisuje što razumije. Sve između, extLst iz novije Excel izvedbe, grana mc:AlternateContent, efekt oblika za koji model nema svojstvo, postoji u datoteci, nema dom u objektnom modelu i nestaje u vrijeme spremanja. Korisnik vidi grafikon koji je izgubio svoj gradijent, prilagođene natpise podataka ili 3D efekt, a radna knjiga ne može objasniti zašto

S PreserveUnsupportedParts omogućenim na radnoj knjizi, HotXLS pohranjuje izvorne UTF-8 bajtove grafikona pri uvozu uz duljinu i 64-bitni otisak modeliranog sadržaja. Ako se tipkani model nije promijenio do vremena spremanja, zapisuje izvorne bajtove natrag. Bez preuređivanja XML-a, bez drifta bjeline, bez rezidentne UTF-16 kopije grafikona koja visi u memoriji za grafikon koji nitko nije uredio

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;

Što spajanje čuva, a što posjeduje model

Pravilo je vlasništvo. Javni čvorovi modela, naslov, serije, predmemorije, grupe crtanja, osi, odlučuje novo generirano stablo. Nemodelirana podstabla prenose se iz izvornog. Ta asimetrija je namjerna i njoj je potrebno trenutak da se internalizira: brisanje serije ne smije uskrsnuti staru seriju iz pohranjenog XML-a, pa se sve što model posjeduje uzima iz modela i onda kad model kaže nestalo

Sadržaj bez vlasnika ponovno se umeće uz praćene čvorove uz koje je sjedio, a extLst ostaje zadnji unutar svog roditelja jer tamo to shema zahtijeva. Brisanje poznatog svojstva, uklanjanje oznake podebljanja, ispuštanje boje, tretira se kao brisanje, a ne kao praznina koju treba popuniti iz izvornog stabla. Nepoznati atributi u istom susjedstvu zadržavaju svoje mjesto

Sadržaj kompatibilnosti oznake dobiva specifično rukovanje. Pri raščlambi, HotXLS preskače mc:Choice i čita mc:Fallback; ako ta grana padanja omata grupu crtanja koju model poznaje, spajanje zapisuje novi tipkani sadržaj natrag u podstablo pada. Bez tog koraka spremanje bi emitiralo novu grupu crtanja i ostavilo staru unutar pada, a grafikon bi nosio dvije

Isoključivanje jednog grafikona

ClearPreservedXml ispušta izvorni XML i otisak za jedan grafikon, pa sljedeće spremanje ponovno izgrađuje taj grafikon isključivo iz tipkanog modela. To je odluka po grafikonu; svojstvo na razini radne knjige PreserveUnsupportedParts i dalje upravlja time gradi li se stanje očuvanja pri uvozu

Posegnite za njim kad želite čist grafikon, a ne vjeran, primjerice kad grafikon predloška nosi formatiranje iz stare korporativne teme i smisao je operacije odbaciti ga. Ne posegnite za njim kao refleksom otklanjanja problema: grafikon koji se nakon uređivanja renderira pogrešno češće je pitanje modeliranja nego pitanje očuvanja, a brisanje pohranjenog XML-a uništava dokaz

Kombinirani grafikoni i druga os

AddPlotGroup izgrađuje uređene kombinirane grafikone, gdje svaka grupa crtanja zadržava vlastitu obitelj grafikona i vlastitu dodjelu primarne ili sekundarne osi. To je ono što svima prisutan poslovni grafikon treba: prihod kao stupci na lijevoj osi, postotak marže kao crta na desnoj

Grafikoni izlažu primarne i sekundarne osi kategorija i vrijednosti te os serija, s tipkanim postavkama kategorije, vrijednosti, datuma i osi serija koje pokrivaju pozicije, identifikatore, križanja, jedinice datuma, intervale natpisa i vidljivost. Stariji ravni API, ChartType, AddSeries, ravna kolekcija Series, i dalje adresira primarnu grupu crtanja, pa postojeći kod nastavlja raditi 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;

Prije nego što je ovaj model postojao, otvaranje i ponovno spremanje kombiniranog grafikona urušavalo bi ga u jednu obitelj grafikona i gubilo sekundarne, datumske osi i osi serija. Referentni formule grafikona i predmemorirane vrijednosti serija sada preživljavaju kopije radne knjige i cikluse otvaranja i spremanja jednako tako, a sidra grafikona podudaraju se sa svojim dijelovima grafikona po identifikatoru odnosa, tako da aplikacija koja preuređuje unose odnosa više ne mijenja sadržaj grafikona između pozicija radnog lista

Zamka ručnog rasporeda

Ako ručno pozicionirate područje crtanja, naslov, naslov osi ili legendu, zapišite sve četiri koordinate. Office zahtijeva x, y, w i h kao potpunu grupu kad god je ijedan od njih prisutan, inače zanemaruje cijeli manualLayout. HotXLS uvijek emitira puni pravokutnik iz tog razloga, a SetPositionAndSize postavlja i omogućuje ga jednim pozivom

Dvije dodatne pojedinosti slijede Excel, a ne punu slobodu specifikacije. Pozicija se zapisuje s xMode i yMode postavljenim na edge, dok veličina koristi factor za wMode i hMode, jer to zapisuje Excel i u što pretvara druge kombinacije. A layoutTarget emitira se samo za područje crtanja, nikad za naslove ili legende, gdje napomene Microsoft implementacije to zabranjuju

Uklapanje ovoga u povratni put radne knjige

Očuvanje grafikona jedan je primjer opće politike: knjižnica koja uređuje dokumente autorizirane drugdje treba promijeniti ono što je zatraženo i ništa drugo. Isti razlog pokreće HotXLS na temama, lanceima izračuna i proširenjima radnih listova, opisano u bilješkama o bezgubitnim povratnim putovima za temu, extLst i calcChain te o VBA projektima i vanjskim poveznicama u očuvanju VBA i vanjskih poveznica. Za samu površinu autorstva grafikona, stvaranje grafikona, smještanje slika i crteža iz Delphija, pogledajte prikaz grafikona, slika i crteža u HotXLS-u

HotXLS čita, uređuje i zapisuje XLSX grafikone iz izvornog Delphi i C++Builder koda bez instalacije Excela na stroju, što je vjernost čini problemom knjižnice, a ne problemom automatizacije. Na stranici HotXLS komponente proračunskih tablica nalazi se popis značajki grafikona i probno preuzimanje