HotXLS menulis workbook Open XML ISO/IEC 29500 Strict dari Delphi dan C++Builder dengan mengatur satu properti, StrictOOXML, sebelum menyimpan. Setiap bagian dalam paket, mulai dari xl/workbook.xml hingga berkas relationship dan content type, ditulis dengan kosakata strict purl.oclc.org, bukan kosakata transitional schemas.openxmlformats.org, dan fitur yang tidak diizinkan oleh Strict ditolak dengan exception eksplisit alih-alih tetap ditulis
Sebagian besar developer bertemu persyaratan ini lewat dokumen pengadaan. Tender sektor publik di berbagai yurisdiksi meminta bentuk Open XML yang terstandardisasi ISO, bukan bentuk transitional yang secara default ditulis Office, dan arsip yang mewajibkan ISO 29500 Strict akan menolak .xlsx biasa meskipun Excel membukanya dengan sempurna. Namespace transitional ada untuk mengakomodasi perilaku biner lawas; namespace strict adalah standar yang sesungguhnya
Apa yang sebenarnya berbeda antara Strict dan Transitional?
Perbedaan yang terlihat adalah kosakata. Bagian workbook strict mendeklarasikan http://purl.oclc.org/ooxml/spreadsheetml/main sebagai namespace root-nya dan http://purl.oclc.org/ooxml/officeDocument/relationships untuk referensi relationship, dan tidak boleh ada namespace transitional yang bertahan di mana pun dalam paket. Tipe relationship berubah mengikutinya, sehingga bagian relationship root menamai .../ooxml/officeDocument/relationships/officeDocument, bukan padanan openxmlformats yang lazim, dan tipe extended properties ditulis camelCase sebagai extendedProperties
Perbedaan yang tidak terlihat adalah cakupan. Strict dengan sengaja menghilangkan bagian dari skema transitional yang hanya ada untuk round-trip berkas biner lawas, beserta ekstensi vendor yang belakangan ditambahkan Office. Itulah sebabnya konversinya bukan sekadar cari dan ganti string: sebagian fitur memang tidak memiliki ejaan strict dan tidak boleh ditulis sama sekali
Mengaktifkannya
Kode authoring biasa tidak berubah. Bangun workbook seperti biasa, atur flag-nya, lalu simpan:
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; // output ISO/IEC 29500 Strict
if Wb.SaveAs('archive-copy.xlsx') <> 1 then
raise Exception.Create('strict save failed');
finally
Wb.Free;
end;
end;
Flag ini direset di awal setiap operasi save dan ditetapkan ulang dari properti workbook, sehingga exception pada satu penyimpanan tidak dapat membocorkan mode strict ke penyimpanan berikutnya. Detail itu penting pada proses server tempat satu objek workbook melayani beberapa permintaan ekspor
Mengapa penyimpanan strict bisa menolak berjalan?
Empat keluarga fitur adalah ekstensi Microsoft tanpa padanan ISO 29500 Strict, dan HotXLS memunculkan exception saat penyimpanan alih-alih menerbitkan paket yang mengklaim konformansi strict padahal bukan:
// Output Strict tidak dapat menyematkan proyek VBA
// -> simpan workbook berbasis macro sebagai .xlsm transitional
// Output Strict tidak dapat membawa form control
// -> tombol, checkbox, combo box, dan ctrlProps-nya
// Output Strict tidak dapat membawa threaded comment
// -> model persons/threads modern, bukan note klasik
// Output Strict tidak dapat membawa metadata dynamic array
// -> rentang spill yang dicatat lewat bagian metadata
Gagal dengan keras adalah trade-off yang tepat di sini. Proyek VBA yang secara diam-diam terbuang mengubah workbook yang berfungsi menjadi workbook rusak yang tetap dapat dibuka, dan laporan kegagalannya baru tiba dari pengguna berminggu-minggu kemudian. Sebuah exception menyebutkan fitur dan properti yang perlu diubah selagi kode pemanggil masih tahu apa yang sedang diekspornya. Pelestarian macro dan external link pada jalur transitional dibahas dalam melestarikan proyek VBA dan external link
Dua keluarga ekstensi ditangani secara berbeda, dan ada baiknya diketahui alasannya. Data bar, sparkline, dan fitur serupa berada dalam kosakata x14 dan xm, dan varian SVG pada gambar berada dalam c15. Ini adalah konten extension list yang namespace-nya self-describing, parser spreadsheet umum mentolerirnya, dan tidak ada padanan ISO untuk menerjemahkannya. HotXLS mempertahankannya alih-alih membuang konten pengguna begitu saja. Jika validator dalam pipeline Anda juga ketat soal extension selain namespace, hapus fitur tersebut dari workbook sumber sebelum mengekspor
Penerjemahan harus menjangkau bagian yang biasanya tidak pernah ditulis ulang siapa pun
Masalah rekayasa yang menarik dalam output strict bukanlah XML worksheet. Masalahnya adalah bagian-bagian yang lebih suka disalin verbatim oleh writer yang cepat. HotXLS melestarikan theme, connection, external link, chart, dan blob pivot dengan menyalin byte terkompresi aslinya langsung, yang merupakan hal yang benar untuk fidelitas dan hal yang salah untuk output strict, karena byte yang disalin membawa namespace transitional
Di bawah StrictOOXML, kelima jalur pelestarian tersebut beralih ke pembangunan ulang atau ke replay penerjemahan, melewati jalur cepat penyalinan byte. Semua XML melewati satu rutin penerjemahan, yang berlabuh pada nilai atribut bertanda kutip ganda sehingga string yang tampak seperti URI di dalam sebuah cell tidak pernah bisa tertulis ulang secara tidak sengaja. Teks cell yang mengandung URI yang sama di-escape sebagai entity dalam XML, sehingga penggantian yang berlabuh itu tidak dapat melihatnya. Streaming writer menerjemahkan skeleton-nya terlebih dahulu lalu memecah pada sheetData, karena blok baris sama sekali tidak mengandung URI kosakata. Mekanisme terkait untuk jalur pelestarian dibahas dalam round-trip lossless untuk theme, extension list, dan calcChain
Membaca berkas yang disimpan Excel sebagai strict
Output hanya separuh cerita. Excel menawarkan "Strict Open XML Spreadsheet" sebagai opsi penyimpanan, dan berkas yang dihasilkan dengan cara itu harus terbuka dengan benar. HotXLS menormalkan tipe relationship di setiap titik parsing relationship dalam paket, root, external link, worksheet, drawing, dan pivot table, sehingga tipe relationship strict cocok dengan konstanta internal yang sama seperti padanan transitional-nya
Padanan sisi pembaca adalah normalisasi prefix namespace, yang memungkinkan prefix sembarang dan kedua kosakata teresolusi ke satu tabel nama kanonis. Pekerjaan itu bermanfaat baik untuk berkas biasa maupun berkas strict, karena generator pihak ketiga mengikat prefix dengan bebas, dan itu adalah mekanisme yang sama yang dijelaskan dalam resolusi relationship OPC dalam paket XLSX
Daftar periksa singkat sebelum Anda merilis output strict
Verifikasi dengan paketnya, bukan dengan Excel. Excel membuka kedua bentuk dengan lancar, sehingga keberhasilan membuka tidak membuktikan apa pun soal konformansi. Unzip hasilnya dan konfirmasi bahwa xl/workbook.xml mendeklarasikan namespace purl, tidak ada bagian yang mengandung schemas.openxmlformats.org/spreadsheetml, dan tipe relationship dalam _rels/.rels serta xl/_rels/workbook.xml.rels menggunakan bentuk strict
Kemudian buka kembali berkas melalui HotXLS dan bandingkan value, formula, format, dan hyperlink terhadap sumbernya. Pengujian baca-ulang adalah satu-satunya cara murah untuk membuktikan bahwa penerjemahan tidak merusak konten, dan sekaligus menjalankan normalisasi sisi pembaca. Jika workbook Anda membawa chart, periksa juga itu, karena bagian chart adalah salah satu bagian yang dilestarikan yang beralih ke jalur bangun ulang di bawah mode strict
Output strict, pembacaan yang toleran, dan pelestarian lossless semuanya bagian dari engine OOXML yang sama untuk Delphi dan C++Builder; daftar fitur lengkapnya ada di halaman komponen spreadsheet Delphi HotXLS