Tekninen artikkeli

Excel-kaavioiden muokkaus ilman ChartML:n menettämistä HotXLS:llä

HotXLS pitää tuodun Excel-kaavion alkuperäisen ChartML:n ja toistaa sen tavu tavulta kun mitään tyypitetyssä mallissa ei muuttunut, joten työkirjan avaaminen ja uudelleentallentaminen ei hiljaa riisu niitä kaavion osia joita oliomalli ei edusta. Muokkaa otsikkoa, sarjaa tai akselia ja HotXLS yhdistää rakenteellisesti uudet tyypitetyt solmut alkuperäiseen puuhun sen sijaan että se tuottaisi kaavion uudelleen tyhjästä

Juuri tuo ero — toisto kun koskematon, yhdistäminen kun muokattu — on se mikä tekee Delphi-sovelluksesta turvallisen osoittaa kaavioita jotka analyytikko rakensi Excelissä. Kaavion tuottaminen uudelleen tyypitetystä mallista menettää aina kaiken sen mitä malli ei tiedä, ja Excel-kaaviot ovat täynnä asioita joita kirjasto ei tiedä: mukautetut tyylit, laajennusluettelot, vaihtoehtoisen sisällön haarat, nimiavaruudella varustetut muotoilut lisäosista

Miksi työkirjan uudelleentallennus litistää sen kaaviot?

Koska tavallinen toteutus lukee mitä ymmärtää ja kirjoittaa mitä ymmärtää. Kaikki välissä — extLst uudemmasta Excel-versiolta, mc:AlternateContent-haara, muototehoste jolla mallilla ei ole ominaisuutta — on olemassa tiedostossa, ei ole kotia oliomallissa, ja katoaa tallennushetkellä. Käyttäjä näkee kaavion joka menetti liukuvärinsä, mukautetut tietonimensä tai 3D-tehosteensa, eikä työkirja osaa selittää miksi

Kun PreserveUnsupportedParts on käytössä työkirjassa, HotXLS tallentaa alkuperäiset UTF-8-kaaviotavut tuonnin yhteydessä yhdessä pituuden ja mallinnetun sisällön 64-bittisen sormenjäljen kanssa. Jos tyypitetty malli ei ole muuttunut tallennushetkeen mennessä, se kirjoittaa alkuperäiset tavut takaisin. Ei XML:n uudelleenjärjestelyä, ei tyhjämerkkiajelua, ei asukasta UTF-16-kopiona kaaviosta joka roikkuu muistissa kaaviolle jota kukaan ei muokannut

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;

Mitä yhdistäminen pitää ja mitä malli omistaa

Sääntö on omistajuus. Julkiset mallin solmut — otsikko, sarjat, välimuistit, piirtoryhmät, akseleita — päättää äskettä tuotettu puu. Mallintamattomat alipuut siirretään alkuperäisestä. Tuo epäsymmetria on tahallaan tehty, ja se on se osa jonka sisäistäminen vie hetken: sarjan poistaminen ei saa herättää vanhaa sarjaa henkiin säilytetystä XML:stä, joten kaikki mitä malli omistaa otetaan mallista silloinkin kun malli sanoo "poissa"

Omistamaton sisältö lisätään uudelleen täsmättyjen solmujen viereen joiden vieressä se istui, ja extLst pysyy viimeisenä vanhempansa sisällä koska skeema vaatii sen. Tunnetun ominaisuuden tyhjentäminen — bold-lipun poistaminen, värin pudottaminen — käsitellään tyhjennyksenä, ei aukkona joka täytetään alkuperäisestä puusta. Tuntemattomat attribuutit samalla alueella pitävät paikkansa

Markup-yhteensopivuussisältö saa erityiskohtelua. Jäsennyksessä HotXLS ohittaa mc:Choice:n ja lukee mc:Fallback:n; jos tuo varaushaara kietoo piirtoryhmän jonka malli tuntee, yhdistäminen kirjoittaa uuden tyypitetyn sisällön takaisin varausalipuuhun. Ilman tuota askelta tallennus emitoisi uuden piirtoryhmän ja jättäisi vanhan varauksen sisään, ja kaavio kantaisi kahta

Yhden kaavion ulos-ottaminen

ClearPreservedXml pudottaa alkuperäisen XML:n ja sormenjäljen yhdelle kaaviolle, joten seuraava tallennus rakentaa kyseisen kaavion puhtaasti tyypitetystä mallista. Se on kaavikohtainen päätös; työkirjatason PreserveUnsupportedParts hallitsee yhä rakennetaanko säilytystila tuonnissa

Tartu siihen kun halat puhtaan kaavion uskollisen sijaan — esimerkiksi kun pohjakaavio kantaa vanhan yritysteeman muotoiluja ja operaation pointti on hylätä se. Älä tartu siihen vianmääritysrefleksinä: kaavio joka renderöityy väärin muokkauksen jälkeen on useammin mallintamiskysymys kuin säilytyskysymys, ja säilytetyn XML:n tyhjentäminen tuhoaa todisteen

Yhdistelmäkaaviot ja toinen akseli

AddPlotGroup rakentaa järjestettyjä yhdistelmäkaavioita, joissa jokainen piirtoryhmä pitää oman kaavioperheensä ja oman ensisijaisen tai toissijaisen akselisijoituksensa. Se on mitä tunnetusti liiketoimintakaavio tarvitsee: liikevaihto pylväinä vasemman akselin mukaan, kateprosentti viivana oikean mukaan

Kaaviot paljastavat ensisijaiset ja toissijaiset kategoria- ja arvo-akselit plus sarja-akselin, tyypitettyjen kategoria-, arvo-, päiväys- ja sarja-akseliasetusten kattaessa paikat, tunnisteet, risteykset, päiväysyksiköt, nimikevälit ja näkyvyyden. Vanhempi litteä API — ChartType, AddSeries, litteä Series-kokoelma — osoittaa yhä ensisijaiseen piirtoryhmään, joten olemassa oleva koodi pitää toiminnassa samalla kun alla oleva malli pitää joka järjestetyn ryhmän

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;

Ennen kuin tämä malli oli olemassa, yhdistelmäkaavion avaaminen ja uudelleentallentaminen romahdutti sen yhteen kaavioperheeseen ja menetti toissijaiset, päiväys- ja sarja-akselit. Kaavion kaavaviittaukset ja välimuistissa olevat sarja-arvot selviävät nyt työkirjakopioista ja avaa/tallenna-sykleistä yhtä lailla, ja kaavio ankkurit täsmätään niiden kaavio-osien kanssa suhdetunnisteen perusteella — joten sovellus joka järjestää suhdemerkit uudelleen ei enää vaihda kaavion sisältöjä laskentataulukon paikkojen välillä

Manuaalinen asetteluloukku

Jos sijoitat piirtoalueen, otsikon, akseliotsikon tai selitteen käsin, kirjoita kaikki neljä koordinaattia. Office vaatii x:n, y:n, w:n ja h:n täydellisenä ryhmänä aina kun yksikin niistä on läsnä, ja jättää koko manualLayout:n huomiotta muuten. HotXLS emitoi aina täyden suorakulmion siksi, ja SetPositionAndSize asettaa ja ottaa sen käyttöön yhdellä kutsulla

Kaksi lisäyksityiskohtaa seuraavat Exceliä eivätkä spesifikaation täyttä vapautta. Paikka kirjoitetaan xMode:lla ja yMode:lla asetettuna edge:en samalla kun koko käyttää factor:a wMode:lle ja hMode:lle, koska se on sitä mitä Excel kirjoittaa ja mitä se muuttaa muut yhdistelmät. Ja layoutTarget emitoidaan vain piirtoalueelle, ei koskaan otsikoille tai selitteille, missä Microsoftin toteutusmuistiinpanot kieltävät sen

Sopivuus työkirjan edestakaiseen matkaan

Kaavioiden säilyttäminen on yksi ilmentymä yleisestä käytännöstä: kirjaston joka muokkaa muualla laadittuja asiakirjoja pitäisi muuttaa sitä mitä pyydettiin muuttamaan eikä mitään muuta. Sama päättely ajaa HotXLS:ää teemoissa, laskentaketjuissa ja laskentataulukoiden laajennuksissa, kuvattuna muistiinpanoissa häviötön edestakainen teemalle, extLst:lle ja calcChainille, ja VBA-projekteille ja ulkoisille linkeille VBA:n ja ulkoisten linkkien säilyttäminen. Itse kaavionluontialustaa varten — kaavioiden luominen, kuvien ja piirrosten sijoittaminen Delphistä — katso artikkeli kaaviot, kuvat ja piirrokset HotXLS:ssä

HotXLS lukee, muokkaa ja kirjoittaa XLSX-kaavioita natiivista Delphi- ja C++Builder-koodista ilman Excel-asennusta koneella, mikä on sitä mikä tekee uskollisuudesta kirjasto-ongelman eikä automaatio-ongelman — HotXLS-taulukkolaskentakomponenttisivulta löytyy kaavio-ominaisuusluettelo ja kokeiluversio