Tehnički članak

Pisanje ISO 29500 Strict XLSX fajlova iz Delphija

HotXLS piše ISO/IEC 29500 Strict Open XML radne sveske iz Delphija i C++Buildera podešavanjem jednog svojstva, StrictOOXML, pre čuvanja. Svaki deo paketa, od xl/workbook.xml do fajlova relacija i tipova sadržaja, piše se strogim purl.oclc.org rečnicima umesto prelaznih schemas.openxmlformats.org, a funkcije koje Strict ne dozvoljava se odbacuju eksplicitnim izuzetkom umesto da se ipak upišu

Većina programera sreće ovaj zahtev kroz dokument nabavke. Tenderi javnog sektora u nekoliko jurisdikcija traže ISO standardizovan oblik Open XML-a, ne prelazni oblik koji Office podrazumevano piše, a arhiva koja nalaže ISO 29500 Strict odbaciće normalan .xlsx iako ga Excel savršeno otvara. Prelazni nazivni prostori postoje da bi se prilagodili nasleđenom binarnom ponašanju; strogi su sam standard

Šta se zapravo razlikuje između Strict i Transitional?

Vidljiva razlika je rečnik. Deo strogo radne sveske deklariše http://purl.oclc.org/ooxml/spreadsheetml/main kao svoj koreni nazivni prostor i http://purl.oclc.org/ooxml/officeDocument/relationships za reference relacija, i nijedan prelazni nazivni prostor ne sme preživeti bilo gde u paketu. Tipovi relacija se menjaju s tim, pa koreni deo relacija imenuje .../ooxml/officeDocument/relationships/officeDocument umesto poznatog openxmlformats ekvivalenta, a tip proširenih svojstava je camelCase kao extendedProperties

Nevidljiva razlika je obim. Strict namerno izostavlja delove prelazne šeme koji su postojali samo da bi omogućili povratak na nasleđene binarne fajlove, zajedno sa proizvođačkim proširenjima koje je Office naknadno dodao. Zato konverzija nije pretraga i zamena stringova: neke funkcije jednostavno nemaju strog zapis i ne smeju se uopšte upisati

Uključivanje

Obični kod za autorstvo se ne menja. Izgradite radnu svesku kao i uvek, postavite zastavicu i sačuvajte:

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 resetuje na početku svake operacije čuvanja i ponovo dodeljuje iz svojstva radne sveske, tako da izuzetak tokom jednog čuvanja ne može propustiti strogi režim u sledeće. Taj detalj je bitan u serverskim procesima gde jedan objekat radne sveske opslužuje nekoliko zahteva za izvoz

Zašto strogo čuvanje može da odbije pokretanje?

Četiri porodice funkcija su Microsoft proširenja bez ekvivalenta u ISO 29500 Strict, a HotXLS podiže izuzetak u trenutku čuvanja umesto da emituje paket koji tvrdi strogu usklađenost, a nije:

// Strogi izlaz ne može da ugradi VBA projekat
//   -> sačuvajte radne sveske sa makroima kao prelazni .xlsm
// Strogi izlaz ne može da nosi kontrole obrazaca
//   -> dugmad, polja za potvrdu, padajuće liste i njihova ctrlProps
// Strogi izlaz ne može da nosi komentare u nizu
//   -> moderan model persons/threads, ne klasične beleške
// Strogi izlaz ne može da nosi metapodatke dinamičkog niza
//   -> opsezi prosipanja zabeleženi kroz deo metapodataka

Glasan neuspeh je ovde ispravan izbor. Tiho izbačen VBA projekat pretvara radnu svesku koja je funkcionisala u pokvarenu koja se i dalje otvara, a izveštaj o otkazu stiže od korisnika nedeljama kasnije. Izuzetak imenuje funkciju i svojstvo koje treba promeniti dok pozivajući kod još zna šta je izvozio. Očuvanje makroa i eksternih veza na prelaznoj putanji je obrađeno u očuvanju VBA projekata i eksternih veza

Dve porodice proširenja se tretiraju drugačije, i vredi znati zašto. Trake podataka, sparklines i slične funkcije žive u rečnicima x14 i xm, a SVG varijante slika žive u c15. Ovo je sadržaj liste proširenja čiji su nazivni prostori samo-opisujući, opšti parseri tabela ih toleriše, i ne postoji ISO ekvivalent u koji bi se preveli. HotXLS ih zadržava umesto da odbaci korisnički sadržaj. Ako je validator u vašem pipeline-u strog i po pitanju proširenja, a ne samo nazivnih prostora, uklonite te funkcije iz izvorne radne sveske pre izvoza

Prevod mora da dosegne delove koje niko obično ne prepisuje

Zanimljiv inženjerski problem u strogom izlazu nije XML radnog lista. To su delovi koje bi brz pisač radije kopirao doslovno. HotXLS čuva teme, veze, eksterne veze, grafikone i pivot blobove kopiranjem njihovih originalnih komprimovanih bajtova direktno, što je tačno ispravna stvar za vernost, a tačno pogrešna za strogi izlaz, jer kopirani bajtovi nose prelazne nazivne prostore

Pod StrictOOXML tih pet očuvanih putanja prelaze na ponovnu izgradnju ili prevodeći ponovni prolaz, zaobilazeći brzu putanju kopiranja bajtova. Sav XML prolazi kroz jednu rutinu prevoda, koja se sidri na vrednostima atributa u dvostrukim navodnicima tako da string koji liči na URI unutar ćelije nikada ne može biti nehotice prepisan. Tekst ćelije koji sadrži isti URI je izbegavan kao entitet u XML-u, tako da usidrena zamena to ne može videti. Pisac za striming prevodi svoj skelet prvo, a zatim se deli na sheetData, jer blokovi redova ne sadrže nijedan URI rečnika. Povezana mehanika za putanju očuvanja je obrađena u bezgubitnim povratnim putovanjima tema, listi proširenja i calcChain-a

Čitanje fajlova koje je Excel sačuvao kao strogi

Izlaz je samo polovina priče. Excel nudi "Strict Open XML Spreadsheet" kao opciju čuvanja, a fajlovi napravljeni na taj način moraju se ispravno otvoriti. HotXLS normalizuje tipove relacija na svakom mestu parsiranja relacija u paketu, korenom, eksternim vezama, radnim listovima, crtežima i pivot tabelama, tako da strog tip relacije odgovara istoj internoj konstanti kao njegov prelazni pandan

Odgovarajuća strana čitača je normalizacija prefiksa nazivnog prostora, koja dozvoljava proizvoljne prefikse i oba rečnika da se razreše u jednu kanonsku tabelu imena. Taj rad koristi običnim fajlovima kao i strogim, jer generatori trećih strana slobodno vezuju prefikse, i to je ista mehanika opisana u razrešavanju OPC relacija u XLSX paketima

Kratka lista provere pre nego što isporučite strogi izlaz

Proverite paket, ne Excel. Excel otvara oba oblika bez problema, pa uspešno otvaranje ne dokazuje ništa o usklađenosti. Otpakujte rezultat i potvrdite da xl/workbook.xml deklariše purl nazivni prostor, da nijedan deo ne sadrži schemas.openxmlformats.org/spreadsheetml, i da tipovi relacija u _rels/.rels i xl/_rels/workbook.xml.rels koriste stroge oblike

Zatim ponovo otvorite fajl kroz HotXLS i uporedite vrednosti, formule, formate i hiperveze sa izvorom. Test ponovnog čitanja je jedini jeftin način da se dokaže da prevod nije oštetio sadržaj, a istovremeno vežba normalizaciju na strani čitača. Ako vaše radne sveske nose grafikone, proverite i njih, jer je deo grafikona jedan od očuvanih delova koji prelazi na ponovo izgrađenu putanju pod strogim režimom

Strogi izlaz, tolerantno čitanje i bezgubitno očuvanje su svi deo istog OOXML pogona za Delphi i C++Builder; kompletna lista funkcija je na stranici HotXLS Delphi komponente za tabele