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