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