Zaledje poročanja v Delphiju, ki je leta oddajalo .xlsx, dobi novo zahtevo: predpisi o javnem naročanju stranke v javnem sektorju zahtevajo izhod OpenDocument Spreadsheet, analitiki na tem računu pa pošljejo svoje popravke nazaj kot datoteke .ods, shranjene iz LibreOffice. Torej mora ista koda zdaj pisati ODS in ga brati. HotXLS, Loslabjeva izvorna knjižnica Object Pascal za preglednice za Delphi in C++Builder, obravnava obe smeri brez nameščenega Excela ali LibreOffice. Kar ne počne, je narediti obe smeri simetrični. Izvoz nosi veliko več, kot uvoz obnovi, in ekipa, ki predpostavi drugače, bo opazovala, kako formule in oblikovanje izginejo nekje med strankinim popravkom in naslednjim poročilom, brez nobene napake, ki bi jo kazala.
Podpora ODS je na fasadi XLSX, ne XLS
HotXLS dostavi dve neodvisni hierarhiji razredov v enem paketu: TXLSWorkbook v enoti lxHandle za binarne datoteke BIFF8 .xls, in TXLSXWorkbook v enoti lxHandleX za pakete OOXML .xlsx. Vsaka vstopna točka OpenDocument - OpenODS, SaveAsODS, GetODSSheetNames - visi iz TXLSXWorkbook. Postavitev ni naključna. Paket ODS, kot je opisan v OASIS ODF 1.3, je zip arhiv, ki nosi člana mimetype, manifest in telo content.xml, kar ga naredi za strukturnega bratranca zip OOXML; BIFF8 je binaren tok zapisov iz devetdesetih let, ki nima ničesar skupnega.
Ta postavitev ima praktično prednost: zastarelega delovnega zvezka .xls ni mogoče pretvoriti v .ods z enim klicem. Vsebino BIFF premostite v model XLSX najprej z SaveXLSWorkbookAsXLSX iz enote lxXlsxExport, znova odprete rezultat prek TXLSXWorkbook in od tam izvozite. Most ni brez izgub in vrzeli je vredno poznati, preden gradite nanj. Kopira vrednosti, formule, formate števil, pisave, zapolnitve in širine stolpcev. Odvrže obrobe, spojene obsege, komentarje, grafikone in pogojno oblikovanje. Vir .xls s težkim oblikovanjem bo prispel v ODS videti preprosteje, kot je odšel, in to je lastnost mosta, ne pisalnika ODS.
Zaznavanje na strani uvoza je samodejno. Navadna metoda Open prepozna paket ODS po svojem članu mimetype, pri čemer se vrne na preverjanje content.xml na vrhnjem nivoju, ko ta član manjka, tako da splošna kodna pot "odpri, kar koli je uporabnik naložil" ne potrebuje lastnega zaznavanja razširitve. Po odpiranju lastnost SourceFormat poroča, katera veja se je sprožila.
Izvoz v ODS z TODSExportOptions
Sam klic izvoza je ena vrstica; objekt možnosti okoli njega nosi odločitve, o katerih bo recenzent vprašal pozneje:
var
Book: TXLSXWorkbook;
Opts: TODSExportOptions;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('quarterly-report.xlsx');
Opts := TODSExportOptions.Create; // caller owns and frees this
try
Opts.Generator := 'ReportService 4.2'; // meta:generator override
Opts.IncludeCharts := True;
Opts.IncludeImages := True;
Book.SaveAsODS('quarterly-report.ods', Opts);
finally
Opts.Free;
end;
finally
Book.Free;
end;
end;
Objekt možnosti je v lasti klicatelja. HotXLS ga ne bo osvobodil, kar je razlog, zakaj je notranje try..finally tam in ni neobvezno. Dve lastnosti, ki spremenita izhod in ne samo označita, sta vredni podrobnejšega pogleda. Nastavitev IncludeCharts := False naredi več kot samo skrije grafikone: iz paketa odstrani pod-dokumente grafov in njihove vnose v manifest, kar je točno tisto, kar želite, ko je porabnik podatkovni cevovod, ki bi se ob njih spotaknil. Generator prepiše niz ODF meta:generator, ki sicer prebere HotXLS/<version>; prebrišite ga, ko orodja dolvodni ugotavljajo prstni odtis proizvajalcev datotek za usmerjanje podpore. Če nič od tega ne velja, objekt možnosti v celoti preskočite. Klicanje SaveAs(FileName, xlsxOpenDocumentSpreadsheet) je enako kot SaveAsODS s privzetimi vrednostmi, preobremenitve tokov na obeh pa vam omogočajo, da paket neposredno zapišete v odziv HTTP brez začasne datoteke.
Kaj pot uvoza prebere in kaj namerno preskoči
Ta del preberite skrbno, preden komu obljubite zvestobo zaokrožnega potovanja. Uvoz ODS v HotXLS je namerno lahka pot. Ohrani skalarne vrednosti celic in predpomnjeni rezultat, ki ga je vsaka formula nosila ob shranjevanju, ter razširi ponavljajoče se vrstice in stolpce v mrežo. Ne prenese slogov, izrazov formul ODS ali risb.
Izbira formule je tista, ki je najverjetnejša ugriz, in bila je narejena namerno. Celica ODF shranjuje dve stvari vzporedno: izraz formule, napisan v dialektu OpenFormula, kot je opredeljen v ODF 1.3 4. del, in zadnjo vrednost, ki jo je zanj izračunala aplikacija. Prevajanje OpenFormula v sintakso formule Excel je lasten problem pretvorbe dialekta, z resničnimi robnimi primeri glede besedišč funkcij, referenčne sintakse in modelov napak. Branje predpomnjene vrednosti namesto tega obide celoten razred tihih napačnih prevodov, zato so številke, ki jih uvozite, točno tiste, ki jih je pošiljatelj nazadnje videl. Cena je, da prispejo kot številke in ne kot žive formule, ki so jih ustvarile.
Način odpovedi, ki ga je treba načrtovati, sledi neposredno: preglednica, katere vsote so bile pravilne, ko jih je LibreOffice nazadnje shranil, se uvozi s pravilnimi številkami, toda te številke so zdaj konstante. Uredite celico za vnos, preračunajte, in nič se ne premakne - formula je izginila, ostal je le njen končni rezultat. Če delovni tok potrebuje žive formule po uvozu, jih programsko znova vzpostavite iz svojih poslovnih pravil prek Cell.Formula, ki na fasadi XLSX sprejme izraz brez vodilnega znaka enakosti.
Načrtovanje asimetričnega zaokrožnega potovanja
Izvoz upodablja iz celotnega modela delovnega zvezka v pomnilniku: vrednosti, slogi in, če jih zahtevate, grafikoni in slike. Uvoz vrne samo vrednosti. Torej je pot .xlsx v .ods visoko zvesta, pot .ods v .xlsx pa vrne vrednosti in predpomnjene rezultate, toda ne slogov in ne živih formul. Verižite oba in asimetrija se sestavi. Poln cikel .xlsx v .ods v .xlsx zapiše vse zvesto na poti ven in izgubi sloge in formule na poti nazaj, čeprav na nobeni stopnji nič ni šlo narobe.
Book := TXLSXWorkbook.Create;
try
Book.Open('vendor-revision.ods'); // format auto-detected
if Book.SourceFormat = xlsxOpenDocumentSpreadsheet then
begin
// Values and cached formula results are present after an ODS
// import; styles and live formulas are not. Rebuild whatever
// the downstream pipeline depends on before saving.
Book.Sheets[0].Cells[2, 5].Formula := 'SUM(B2:D2)';
Book.SaveAs('vendor-revision.xlsx');
end;
finally
Book.Free;
end;
Arhitekturni vzorec, ki iz tega izhaja: obravnavajte dohodne datoteke .ods kot podatkovne vire in ne kot dokumente za urejanje na mestu. Kanonični delovni zvezek hranite v .xlsx, vrednosti berite iz revizij strank in na zahtevo oddajajte svež ODS iz kanonične kopije. Preverjanje sodi v oba tabora: odprite izvožene datoteke v LibreOffice Calc, referenčnem potrošniku ODF, in v Excelu, ki že leta bere ODS, a se z LibreOffice ne strinja pri robovih podpore grafikonov in slogov. Število listov, peščica ključnih celic in prisotnost grafikona zadostujeta za dimni test na profil izvoza.
Pregled datoteke ODS pred zavezanostjo uvozu
Ko končna točka sprejema nalaganja, je navajanje imen listov dosti cenejše kot celotno razčlenjevanje in zgodaj ujame strukturna presenečenja:
Names := TStringList.Create;
Book := TXLSXWorkbook.Create;
try
if Book.GetODSSheetNames('incoming.ods', Names) <= 0 then
raise Exception.Create('not a readable ODS package');
if Names.IndexOf('Data') < 0 then
raise Exception.Create('revision is missing the Data sheet');
finally
Book.Free;
Names.Free;
end;
Konvencija vrnjene vrednosti zbode ljudi: klici HotXLS na splošno vrnejo pozitivno število ali 1 pri uspehu in -1 pri neuspehu, pri čemer ob neuspehu izpraznijo seznam, zato testirajte <= 0 in ne primerjajte z eno določeno pozitivno vrednostjo. GetODSSheetNames ne ponastavi niti ne poseli primerka delovnega zvezka, zato lahko en sondni objekt pregleda celoten imenik dohodnih datotek. Strukturna preverjanja, kot je to, ujamejo najpogostejšo resnično napako - analitik preimenuje ali izbriše list pred pošiljanjem revizije nazaj - pri vhodu, kjer sporočilo o napaki še vedno imenuje datoteko in manjkajoči list, namesto da se pojavi kot nična referenca tri plasti globlje.
Če gradite širši cevovod konverzije, vzorec revizijskega in konverzijskega delovnega stola delovnega zvezka prikazuje, kako popisati funkcije datoteke pred izbiro ciljne oblike, vodnik zmogljivosti za velike delovne zvezke pa ohranja skupinske izvoze znotraj razumnih meja pomnilnika.
HotXLS je izvorna knjižnica preglednic za Delphi in C++Builder s polno izvorno kodo; celoten seznam funkcij in podrobnosti licenciranja so na strani HotXLS Component.