Tehnički članak

Pisanje ISO 29500 Strict XLSX datoteka iz Delphija

HotXLS iz Delphija i C++Buildera piše ISO/IEC 29500 Strict Open XML radne knjige postavljanjem jednog svojstva, StrictOOXML, prije spremanja. Svaki dio paketa, od xl/workbook.xml pa do datoteka relacija i tipova sadržaja, piše se koristeći strogi rječnik purl.oclc.org umjesto prijelaznog schemas.openxmlformats.org, a značajke koje Strict ne dopušta odbacuju se izričitom iznimkom umjesto da se ipak zapišu

Većina programera na ovaj zahtjev nailazi kroz dokument javne nabave. Javni natječaji u nekoliko jurisdikcija traže ISO standardizirani oblik Open XML-a, a ne prijelazni oblik koji Office piše po zadanim postavkama, a arhiv koji propisuje ISO 29500 Strict odbacit će običnu .xlsx datoteku iako je Excel savršeno otvara. Prijelazni imenski prostori postoje kako bi se prilagodili naslijeđenom binarnom ponašanju; strogi su pravi standard

Što se zapravo razlikuje između Strict i Transitional oblika?

Vidljiva razlika je rječnik. Strogi dio radne knjige deklarira http://purl.oclc.org/ooxml/spreadsheetml/main kao svoj korijenski imenski prostor i http://purl.oclc.org/ooxml/officeDocument/relationships za reference relacija, i nijedan prijelazni imenski prostor ne smije preživjeti nigdje u paketu. Tipovi relacija mijenjaju se zajedno s time, pa korijenski dio relacija imenuje .../ooxml/officeDocument/relationships/officeDocument, a ne poznati openxmlformats ekvivalent, a tip proširenih svojstava zapisan je u camelCase obliku kao extendedProperties

Nevidljiva razlika je opseg. Strict namjerno izostavlja dijelove prijelazne sheme koji su postojali samo radi vraćanja naslijeđenih binarnih datoteka u izvorno stanje, zajedno s proizvođačkim proširenjima koja je Office naknadno dodao. Zato pretvorba nije obično pretraživanje i zamjena nizova: neke značajke jednostavno nemaju strogi zapis i ne smiju se uopće zapisati

Uključivanje

Uobičajeni kod za izradu se ne mijenja. Izgradite radnu knjigu na uobičajen način, postavite zastavicu i spremite:

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 izlaz
    if Wb.SaveAs('archive-copy.xlsx') <> 1 then
      raise Exception.Create('strict save failed');
  finally
    Wb.Free;
  end;
end;

Zastavica se resetira na početku svake operacije spremanja i ponovno se dodjeljuje iz svojstva radne knjige, tako da iznimka tijekom jednog spremanja ne može procuriti strogi način rada u sljedeće spremanje. Taj detalj je važan u poslužiteljskim procesima gdje jedan objekt radne knjige poslužuje nekoliko zahtjeva za izvoz

Zašto strogo spremanje može odbiti pokretanje?

Četiri obitelji značajki Microsoftova su proširenja bez ekvivalenta u ISO 29500 Strict, a HotXLS podiže iznimku u trenutku spremanja umjesto generiranja paketa koji tvrdi da je strogo usklađen, a nije:

// Strict izlaz ne može ugraditi VBA projekt
//   -> spremite radne knjige s makroima kao prijelazni .xlsm
// Strict izlaz ne može nositi kontrole obrasca
//   -> gumbe, potvrdne okvire, padajuće popise i njihova ctrlProps
// Strict izlaz ne može nositi komentare u nitima (threaded)
//   -> moderni model osoba/niti, ne klasične bilješke
// Strict izlaz ne može nositi metapodatke dinamičkih polja
//   -> raspone prelijevanja zabilježene kroz dio metapodataka

Glasno zakazivanje ovdje je ispravan kompromis. Tiho odbačen VBA projekt pretvara ispravnu radnu knjigu u pokvarenu koja se i dalje otvara, a izvještaj o kvaru stiže od korisnika tjednima kasnije. Iznimka imenuje značajku i svojstvo koje treba promijeniti dok pozivajući kod još zna što je izvozio. Očuvanje makroa i vanjskih poveznica na prijelaznom putu opisano je u očuvanju VBA projekata i vanjskih poveznica

Dvije obitelji proširenja obrađuju se drugačije, i vrijedi znati zašto. Trakice podataka, minigrafovi i slične značajke žive u rječnicima x14 i xm, a SVG varijante slika žive u c15. To je sadržaj popisa proširenja čiji su imenski prostori samoopisujući, opći parseri proračunskih tablica ih toleriraju, a ne postoji ISO ekvivalent u koji bi se preveli. HotXLS ih zadržava umjesto da odbaci korisnički sadržaj. Ako je validator u vašem pipelineu strog i prema proširenjima, ne samo prema imenskim prostorima, uklonite te značajke iz izvorne radne knjige prije izvoza

Prijevod mora doprijeti do dijelova koje nitko obično ne prepisuje

Zanimljiv inženjerski problem u strogom izlazu nije XML radnog lista. To su dijelovi koje bi brzi zapisivač radije doslovno kopirao. HotXLS čuva teme, veze, vanjske poveznice, grafikone i pivot blobove kopiranjem njihovih izvornih komprimiranih bajtova izravno, što je upravo ispravno za vjernost, a upravo pogrešno za strogi izlaz, jer kopirani bajtovi nose prijelazne imenske prostore

Pod StrictOOXML tih pet očuvanih putova prebacuje se na ponovnu izgradnju ili na prijevodnu repriz, zaobilazeći brzi put kopiranja bajtova. Sav XML prolazi kroz jednu rutinu prijevoda koja se sidri na vrijednostima atributa u dvostrukim navodnicima, tako da se niz koji izgleda kao URI unutar ćelije nikada slučajno ne može prepisati. Tekst ćelije koji sadrži isti URI escapira se kao entitet u XML-u, pa ga sidreno zamjenjivanje ne može vidjeti. Zapisivač strujanja prvo prevodi svoj kostur, a zatim se dijeli na sheetData, budući da blokovi redaka uopće ne sadrže URI-je rječnika. Povezana mehanika za put očuvanja opisana je u bezgubitnim kružnim putovanjima tema, popisa proširenja i calcChaina

Čitanje datoteka koje je Excel spremio kao strict

Izlaz je samo pola priče. Excel nudi opciju spremanja „Strict Open XML Spreadsheet”, a datoteke stvorene na taj način moraju se ispravno otvoriti. HotXLS normalizira tipove relacija na svakom mjestu raščlambe relacija u paketu, korijenu, vanjskim poveznicama, radnim listovima, crtežima i pivot tablicama, tako da strogi tip relacije odgovara istoj internoj konstanti kao i njegov prijelazni parnjak

Parnjak na strani čitača je normalizacija prefiksa imenskih prostora, koja dopušta proizvoljne prefikse i oba rječnika da se razriješe u jednu kanonsku tablicu naziva. Taj rad koristi jednako običnim i strogim datotekama, budući da generatori trećih strana slobodno vežu prefikse, a riječ je o istoj mehanici opisanoj u razrješavanju OPC relacija u XLSX paketima

Kratka provjera prije isporuke strogog izlaza

Provjerite pomoću paketa, ne pomoću Excela. Excel rado otvara oba oblika, pa uspješno otvaranje ne dokazuje ništa o usklađenosti. Raspakirajte rezultat i potvrdite da xl/workbook.xml deklarira purl imenski prostor, da nijedan dio ne sadrži schemas.openxmlformats.org/spreadsheetml, i da tipovi relacija u _rels/.rels i xl/_rels/workbook.xml.rels koriste stroge oblike

Zatim ponovno otvorite datoteku kroz HotXLS i usporedite vrijednosti, formule, formate i hiperveze s izvorom. Test ponovnog čitanja jedini je jeftin način da se dokaže da prijevod nije oštetio sadržaj, a istovremeno testira normalizaciju na strani čitača. Ako vaše radne knjige nose grafikone, provjerite i njih, budući da je dio grafikona jedan od očuvanih dijelova koji se pod strogim načinom rada prebacuje na ponovno izgrađen put

Strogi izlaz, tolerantno čitanje i bezgubitno očuvanje dio su istog OOXML mehanizma za Delphi i C++Builder; cjelokupni popis značajki nalazi se na stranici HotXLS Delphi komponente proračunske tablice