Delphi ataskaitavimo uzpakaline dalis, kuri daugelI metu isleido .xlsx, gauna nauja reikalavima: viesojo sektoriaus kliento pirkimo taisykles igpareigoja OpenDocument skaiciuokliniu lenteliu isvestu, o analitikai is tos paskyros grazina savo redagavimus kaip .ods failus, issaugotus is LibreOffice. Tad tas pats kodas dabar turi rasyti ODS ir ji skaityti. HotXLS, losLab gimtoji Object Pascal skaiciuokliu biblioteka Delphi ir C++Builder, tvarko abu kryptis be instaliuoto Excel ar LibreOffice. Ko ji nedaro, tai daro dvi kryptis simetriskas. Eksportas nesha daug daugiau negu importas atgauna, ir komanda, kuri prielaidos kitaip, stebės, kaip formuliai ir formatavimas garuoja kur nors tarp kliento redagavimo ir kitos ataskaitos, be jokios klaidos, kuria butu galima nurodyti.
ODS palaikymas gyvena XLSX fasade, o ne XLS
HotXLS pristato dvi nepriklausomas klases hierarchijas viename pakete: TXLSWorkbook modulyje lxHandle dvejetainems BIFF8 .xls failams ir TXLSXWorkbook modulyje lxHandleX OOXML .xlsx paketams. Kiekvienas OpenDocument prieigos taskas, OpenODS, SaveAsODS, GetODSSheetNames, kabo nuo TXLSXWorkbook. Isdestymas nera atsitiktinis. ODS paketas, kaip nurodo OASIS ODF 1.3, yra zip archyvas, nesiojantis mimetype nari, manifesta ir content.xml turini, kas daro ji strukturiniu OOXML zip pusbroliu; BIFF8 yra 1990-uju dvejetainis irasu srautas su nieko bendra.
Tas isdestymas turi praktiniu krasta: sensas .xls darbaknyges negali tapti .ods vienu kvietimu. Perjunkite BIFF turini i XLSX modeli pirmiausia su SaveXLSWorkbookAsXLSX is modulio lxXlsxExport, atidaryti rezultata per TXLSXWorkbook, tada eksportuoti is ten. Titas tarpas nera be nuostoliu, ir verta zinoti spragas pries kurti ant jo. Jis kopijuoja reiksmes, formules, skaiciaus formatus, siriftus, uzpildus ir stulpeliu plociai. Jis praeina sienas, sujungtus regionus, komentarus, diagramas ir salyginI formatavima. .xls saltinis su sunkiu formatavimo pasiekus ODS atrodys paprastesnis negu paliko, ir tai yra tilto savybe, o ne ODS rasytojo.
Aptikimas importo puseje yra automatinis. Paprastas Open metodas atpazista ODS paketa pagal savo mimetype nari, griezindamas i virsutines-lygio content.xml patikrinima, kai tas narys yra nera, todel generinis "atidaryti viska, ka vartotojas ikele" kodo kelias nereikalauja savo pleteliniu sniffingo. Po atidarymo SourceFormat savybe pranesha, kuri saka paleido.
Eksportavimas i ODS su TODSExportOptions
Pats eksporto kvietimas yra viena eilute; parinkciu objektas aplink ji nesha sprendimus, apie kuriuos apzvalginius klaus veliau:
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;
Parinkciu objektas priklauso iskviektojui. HotXLS jo nelaisvo, kas yra priezastis, kodėl vidinis try..finally yra ten ir nera pasirenkamas. Du savybes, keiciancio isvestu, o ne tik ji zymejimo, vertos artimesnio zvilgsnio. Nustatus IncludeCharts := False daro daugiau negu slepia diagramas: jis isstriia diagramos subdokumentus ir ju manifesto irasus is paketo, kas yra tiksliai tai, ko norite, kai vartotojas yra duomenu konvejeris, kuris su jais sukluptų. Generator pakeicia ODF meta:generator eilute, kuri kitaip skaito HotXLS/<versija>; pakeiskite, kai tolesnio srauto irankiai fingerprints failu kurejo nukreipti palaikyma. Jei tai netaikoma, praleiskite parinkciu objekta visai. Kvietimas SaveAs(FileName, xlsxOpenDocumentSpreadsheet) yra tas pats, kaip SaveAsODS su numatytosiomis, o srauto perkrovimai abiems leidzia jums rasyti paketa tiesiai i HTTP atsakyma be laikino failo.
Ka importo kelias skaito ir ka jis tycia praleidzia
Skaitykite si skyriu atidžiai pries pazadant kam nors apskritojo kelio isteikima. ODS importas HotXLS yra tycia lengvas kelias. Jis issaugo skaliarines lasteleiu reiksmes ir issaugyta rezultata, kuri kiekviena formule nesejo issaugojimo metu, ir issprendzia pasikartojanciais eilutemis ir stulpeliais i tinklelio. Ji neatnesa per stilius, ODS formules israiskas ar piesinius.
Formules pasirinkimas yra tas, kuris labiausiai tikimasi kasti, ir jis buvo padarytas tycia. ODF lastele saugo du dalykus vienas salia kito: formules israiška, parasyta OpenFormula dialekte, apibreztame ODF 1.3 4 dalyje, ir paskutine reiksmen, kuria gamybos programa apskaiciavo jai. Verciamo OpenFormula i Excel formules sintaksę yra sava dialekto-konversijos problema, su tikromis krastaiosiomis aplinkybemis aplink funkciju zodynai, nuorodu sintaksę ir klaidu modeliai. Vietoj to skaitymas issaugotu reiksmeniu apeina visa ta tylaus klaidingo vertimo klase, todel skaiciai, kuriuos importuojate, yra tiksliai skaiciai, kuriuos siuntejas paskutiniu metu mate. Kaina yra ta, kad jie atvyksta kaip skaiciai, o ne kaip gyvos formuliai, kurios juos sukure.
Nesekmes rezimas, skirtas projektuoti, seka tiesiai: skaiciuokline lentele, kurios sumos buvo teisingos, kai LibreOffice paskutiniu metu issaugojo ja, importuoja su teisingais skaiciais, taciau tie skaiciai dabar yra konstantos. Redaguokite ivesties lastele, perskaiciuokite, ir niekas nejuda, formule dingo, liko tik galutinis rezultatas. Jei darbo eiga reikalauja gyvuju formuliu po importo, isnaikinkite jas programatiskai is savo verslo taisykliu per Cell.Formula, kuris XLSX fasade ima israiška be pirmaujancio lygios zenklous.
Projektavimas aplink asimetriski apvaliojo kelio
Eksportas atvaizduoja is pilno atminties darbaknyges modelio: reiksmes, stiliai ir, jei prasite, diagramos ir vaizdai. Importas grazina tik reiksmes. Todel .xlsx i .ods koja yra auksto ticlumo, o .ods i .xlsx koja atgal atnesha reiksmes ir issaugomus rezultatus, bet ne stilizavima ir ne gyvas formules. Sujunkite juos ir asimetrija kaupiasi. Pilnas .xlsx i .ods i .xlsx ciklas raso viska iste iseinant ir praranda stilius bei formules grizant, net jei nieko neteisingo niekaip isitikinau bet kuri zingsnI.
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;
Architekturinis modelis, iseinantis is to: traktuokite ieinancius .ods failus kaip duomenu srauto, o ne kaip dokumentus redaguoti vietoje. Laikykite kanonine darbaknyge .xlsx, skaitykite reiksmes is kliento reviziju ir isskleiskite svieza ODS pagal poreiki is kanonines kopijos. Patikrinimas priklauso abiems stovykloms, atidaryti eksportuotus failus LibreOffice Calc, referentiniame ODF vartotoje, ir Excel, kuri jau daugelI metu skaito ODS, taciau nesutinka su LibreOffice diagramos ir stiliaus palaikymo krasta. Lapu skaicius, keli pagrindiniai lasteliai ir diagramu buvimas yra pakankamas dumu tikrinimas kiekvienam eksporto profiliu.
ODS failo iskirtimas pries si prisamdant i importa
Kai galinis taskas priima ikeles, lapu pavadinimu sarasas yra daug pigesnis negu pilnas analizavimas ir anksti fiksuoja struktūrines netikėtybes:
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;
Grazinimo konvencija suklaidina zmones: HotXLS kvieciami paprastai grazina teigiama skaiciavo arba 1 sekmo atveju ir -1 nesekmes atveju, issvalydami sarasa, kai jie nepasiseka, todel bandykite <= 0, o ne lyginti su vienu konkreciu teigiamu verte. GetODSSheetNames nei nustatina isnaujo nei uzpildo darbaknyges instancija, todel vienas zondavimo objektas gali patikrinti visa kataloga gaunamuju failu. Struktūrines patikros, kaip cia, pagauna dazniausiai pasitaikancio realaus nesekmes, analitikas pervadinantis arba istrindamas lapu pries grazindamas revizija atgal, vartus, kur klaidos pranešimas vis dar gali pavadinti faila ir trukstama lapu vietoj, kad isnirtu kaip nulinis nuoroda tris sluoksnius giliaus.
Jei kuriate platesni konversijos konvejerio aplink tai, darbaknyges audito ir konversijos darbastalio modelis parodo, kaip inventorizuoti failo savybes pries pasirinkti tikslo formata, o dideles-darbaknyges nasumas vadovas issaugo paketo eksportus protingo atminties ribose.
HotXLS yra gimtoji Delphi ir C++Builder skaiciuokliu biblioteka su pilnu saltinio kodu; pilnas funkciju sarasas ir licenciavimo informacija yra HotXLS Component produkto puslapyje.