HotXLS kirjoittaa ISO/IEC 29500 Strict Open XML -työkirjoja Delphistä ja C++Builderista asettamalla yhden ominaisuuden, StrictOOXML, ennen tallennusta. Jokainen paketin osa, aina tiedostosta xl/workbook.xml suhdetiedostoihin ja sisältötyyppeihin asti, kirjoitetaan tiukoilla purl.oclc.org-sanastoilla siirtymäkauden schemas.openxmlformats.org-sanastojen sijaan, ja ominaisuudet, joita Strict ei salli, hylätään selkeällä poikkeuksella sen sijaan, että ne kirjoitettaisiin silti ulos
Useimmat kehittäjät kohtaavat tämän vaatimuksen hankinta-asiakirjan kautta. Julkisen sektorin tarjouspyynnöt useissa oikeudenkäyttöalueissa pyytävät Open XML:n ISO-standardoitua muotoa, ei siirtymäkauden muotoa, jota Office kirjoittaa oletuksena, ja arkisto, joka edellyttää ISO 29500 Strict -muotoa, hylkää tavallisen .xlsx-tiedoston, vaikka Excel avaa sen täydellisesti. Siirtymäkauden nimiavaruudet ovat olemassa mukautuakseen vanhaan binäärikäyttäytymiseen; tiukat nimiavaruudet ovat itse standardi
Mikä todella eroaa Strictin ja Transitionalin välillä?
Näkyvä ero on sanasto. Tiukka työkirjaosa ilmoittaa juurinimiavaruudekseen http://purl.oclc.org/ooxml/spreadsheetml/main ja suhdeviittauksilleen http://purl.oclc.org/ooxml/officeDocument/relationships, eikä mikään siirtymäkauden nimiavaruus saa säilyä missään kohtaa pakettia. Suhdetyypit muuttuvat sen mukana, joten juurisuhteiden osa nimeää muodon .../ooxml/officeDocument/relationships/officeDocument tutun openxmlformats-vastineen sijaan, ja laajennettujen ominaisuuksien tyyppi on camelCase-muodossa extendedProperties
Näkymätön ero on laajuus. Strict jättää tarkoituksella pois osia siirtymäkauden skeemasta, jotka olivat olemassa vain vanhojen binääritiedostojen edestakaista muuntamista varten, sekä toimittajan lisäykset, jotka Office lisäsi myöhemmin. Siksi muunnos ei ole merkkijonojen etsi-ja-korvaa-operaatio: joillakin ominaisuuksilla ei yksinkertaisesti ole tiukkaa kirjoitusasua, eikä niitä saa kirjoittaa lainkaan
Käyttöönotto
Tavallinen kirjoituskoodi ei muutu. Rakenna työkirja kuten aina, aseta lippu ja tallenna:
var
Wb: TXLSXWorkbook;
Sh: TXLSXWorksheet;
begin
Wb := TXLSXWorkbook.Create;
try
Sh := Wb.Sheets.Add('Data');
Sh.Cells[1, 1].Value := 'Product';
Sh.Cells[1, 2].Value := 'Amount';
Sh.Cells[2, 1].Value := 'Widget';
Sh.Cells[2, 2].Value := 17;
Sh.Cells[3, 2].Formula := '=SUM(B2:B2)';
Wb.StrictOOXML := True; // ISO/IEC 29500 Strict -tuloste
if Wb.SaveAs('archive-copy.xlsx') <> 1 then
raise Exception.Create('strict save failed');
finally
Wb.Free;
end;
end;
Lippu nollataan jokaisen tallennustoiminnon alussa ja asetetaan uudelleen työkirjan ominaisuudesta, joten yhden tallennuksen aikainen poikkeus ei voi vuotaa strict-tilaa seuraavaan. Tällä yksityiskohdalla on merkitystä palvelinprosesseissa, joissa yksi työkirjaobjekti palvelee useita vientipyyntöjä
Miksi tiukka tallennus voi kieltäytyä suorittumasta?
Neljä ominaisuusperhettä ovat Microsoftin laajennuksia, joilla ei ole ISO 29500 Strict -vastinetta, ja HotXLS nostaa poikkeuksen tallennushetkellä sen sijaan, että se tuottaisi paketin, joka väittää olevansa tiukan vaatimustenmukainen mutta ei ole:
// Strict-tuloste ei voi upottaa VBA-projektia
// -> tallenna makroja sisältävät työkirjat siirtymäkauden .xlsm-muodossa
// Strict-tuloste ei voi kantaa lomakeohjaimia
// -> painikkeet, valintaruudut, yhdistelmäruudut ja niiden ctrlProps
// Strict-tuloste ei voi kantaa säikeistettyjä kommentteja
// -> nykyaikainen henkilöt/säikeet-malli, ei klassiset muistiinpanot
// Strict-tuloste ei voi kantaa dynaamisten taulukoiden metatietoja
// -> valumisalueet, jotka on tallennettu metatieto-osan kautta
Äänekäs epäonnistuminen on tässä oikea kompromissi. Hiljaa pudotettu VBA-projekti muuttaa toimivan työkirjan rikkinäiseksi, joka silti avautuu, ja raportti virheestä saapuu käyttäjältä vasta viikkojen kuluttua. Poikkeus nimeää ominaisuuden ja muutettavan asetuksen, samalla kun kutsuva koodi vielä tietää, mitä se oli viemässä. Makrojen ja ulkoisten linkkien säilyttäminen siirtymäkauden polulla käsitellään artikkelissa VBA-projektien ja ulkoisten linkkien säilyttäminen
Kahta laajennusperhettä käsitellään eri tavalla, ja on hyvä tietää miksi. Datapalkit, minikaaviot ja vastaavat ominaisuudet asuvat sanastoissa x14 ja xm, ja kuvien SVG-muunnelmat asuvat sanastossa c15. Nämä ovat laajennuslistan sisältöä, jonka nimiavaruudet ovat itsekuvaavia, yleiset laskentataulukkojäsentimet sietävät niitä, eikä niille ole ISO-vastinetta, johon ne voisi kääntää. HotXLS säilyttää ne sen sijaan, että se hylkäisi käyttäjän sisällön kokonaan. Jos putkessasi oleva validaattori on tiukka myös laajennusten suhteen nimiavaruuksien lisäksi, poista nämä ominaisuudet lähdetyökirjasta ennen vientiä
Käännöksen täytyy ulottua osiin, joita kukaan ei normaalisti kirjoita uudelleen
Kiinnostava suunnitteluongelma tiukassa tulosteessa ei ole laskentataulukon XML. Se on osat, jotka nopea kirjoitin mieluummin kopioisi sellaisenaan. HotXLS säilyttää teemat, yhteydet, ulkoiset linkit, kaaviot ja pivot-blobit kopioimalla niiden alkuperäiset pakatut tavut suoraan läpi, mikä on täsmälleen oikea toimintatapa uskollisuuden kannalta ja täsmälleen väärä toimintatapa tiukan tulosteen kannalta, koska kopioidut tavut kantavat siirtymäkauden nimiavaruuksia
Tilassa StrictOOXML nämä viisi säilytettyä polkua vaihtuvat uudelleenrakennukseen tai kääntävään toistoon, ohittaen tavukopioinnin nopean polun. Kaikki XML kulkee yhden käännösrutiinin läpi, joka ankkuroituu lainausmerkeillä ympäröityihin attribuuttiarvoihin, jotta solun sisällä oleva URI:lta näyttävä merkkijono ei voi koskaan kirjoittua uudelleen vahingossa. Solutekstiä, joka sisältää saman URI:n, käsitellään XML:ssä entiteettinä, joten ankkuroitu korvaus ei näe sitä. Suoratoistava kirjoitin kääntää ensin runkonsa ja pilkkoo sitten kohdasta sheetData, koska rivilohkot eivät sisällä lainkaan sanaston URI-osoitteita. Säilytyspolun liittyvä mekaniikka käsitellään artikkelissa teemojen, laajennuslistojen ja calcChainin häviötön edestakainen muunnos
Tiedostojen lukeminen, jotka Excel on tallentanut tiukkana
Tuloste on vain puolet tarinasta. Excel tarjoaa "Strict Open XML Spreadsheet" -tallennusvaihtoehdon, ja sillä tavoin tuotettujen tiedostojen täytyy avautua oikein. HotXLS normalisoi suhdetyypit jokaisessa paketin suhteiden jäsennyskohdassa, juuressa, ulkoisissa linkeissä, laskentataulukoissa, piirroksissa ja pivot-taulukoissa, joten tiukka suhdetyyppi täsmää samaan sisäiseen vakioon kuin sen siirtymäkauden vastine
Lukupuolen vastine on nimiavaruuden etuliitteiden normalisointi, joka sallii mielivaltaiset etuliitteet ja molempien sanastojen ratkeamisen yhteen kanoniseen nimitauluun. Tästä työstä hyötyvät sekä tavalliset tiedostot että tiukat, koska kolmannen osapuolen generaattorit sitovat etuliitteet vapaasti, ja se on sama koneisto, joka kuvataan artikkelissa OPC-suhteiden ratkaisu XLSX-paketeissa
Lyhyt tarkistuslista ennen tiukan tulosteen käyttöönottoa
Tarkista paketin avulla, ei Excelillä. Excel avaa molemmat muodot mielellään, joten onnistunut avaaminen ei todista mitään vaatimustenmukaisuudesta. Pura tulos zip-paketista ja varmista, että xl/workbook.xml ilmoittaa purl-nimiavaruuden, ettei mikään osa sisällä merkkijonoa schemas.openxmlformats.org/spreadsheetml, ja että suhdetyypit tiedostoissa _rels/.rels ja xl/_rels/workbook.xml.rels käyttävät tiukkoja muotoja
Avaa sitten tiedosto uudelleen HotXLS:n kautta ja vertaa arvoja, kaavoja, muotoja ja hyperlinkkejä lähteeseen. Takaisinlukutesti on ainoa halpa tapa todistaa, ettei käännös vahingoittanut sisältöä, ja se harjoittaa samalla lukupuolen normalisointia. Jos työkirjasi kantavat kaavioita, tarkista nekin, koska kaavio-osa on yksi säilytetyistä osista, jotka vaihtuvat uudelleenrakennettuun polkuun tiukassa tilassa
Tiukka tuloste, suvaitsevainen lukeminen ja häviötön säilytys ovat kaikki osa samaa OOXML-moottoria Delphille ja C++Builderille; täydellinen ominaisuusluettelo on sivulla HotXLS Delphi -laskentataulukkokomponentin sivulla