Sebuah spreadsheet membawa dua lapisan identitas. Ada grid sel, dan ada metadata dokumen yang menyertainya: title, author, company, keyword, timestamp. Excel tidak pernah menampilkan lapisan kedua itu di dalam grid, namun itulah lapisan yang diindeks Windows Search, yang dibaca SharePoint untuk memberi judul sebuah dokumen, dan yang menjadi dasar pengarsipan oleh sistem records-management. Ketika sebuah workbook hasil generate mewarisi Author dan Title-nya dari template tempat ia dibangun, setiap sistem hilir mencatat designer template itu sebagai penulis dari empat ribu statement pelanggan. Metadatanya tidak benar di mana pun, tetapi dikonsultasikan di mana-mana
HotXLS mengekspos lapisan ini sebagai properti biasa tingkat workbook di kedua mesinnya: facade BIFF untuk .xls dan facade OOXML untuk .xlsx. Anda membaca sebuah field setelah membuka file dan menulis sebuah field sebelum menyimpannya. Pustaka ini yang memutuskan kontainer fisik mana yang menjadi tempat nilai itu mendarat. Yang layak dipahami sebelum Anda menulis sebuah generator adalah field mana yang sebenarnya didukung tiap format, di mana field itu secara fisik berada, dan satu aturan gerbang yang mengatur apakah sebuah .xlsx mencatat metadata apa pun sama sekali
Dua Format, Dua Model Penyimpanan
Alasan sebuah pustaka spreadsheet membutuhkan dua implementasi metadata, dan alasan tool yang setengah jadi menstempel satu format dengan benar tetapi melupakan yang lain, adalah karena .xls dan .xlsx menyimpan propertinya di tempat yang sama sekali tidak berkaitan. Sebuah workbook BIFF menuliskannya ke dalam stream OLE compound-file, terutama property set SummaryInformation yang lebih tua dari Excel itu sendiri, di samping record WRITEACCESS dalam stream yang menamai siapa pun yang terakhir menyimpan file itu. Sebuah workbook OOXML menyimpannya sebagai bagian XML di dalam paket zip, dipisah menurut tujuannya: docProps/core.xml memegang field Dublin Core (title, creator, subject, keyword, tanggal) dan docProps/app.xml memegang field tingkat aplikasi seperti company dan aplikasi pembuatnya, sesuai ECMA-376 Part 1
HotXLS meratakan kedua model penyimpanan itu menjadi properti langsung dari objek workbook. Anda tidak pernah membuka sebuah stream property-set atau mengedit sebuah bagian XML secara manual. Anda menetapkan string dan tanggal ke workbook, dan kontainer yang tepat terwujud dengan sendirinya untuk format mana pun yang Anda simpan
Menstempel Workbook Hasil Generate dari Rekaman Bisnis
Pada sisi XLSX, TXLSXWorkbook mengekspos Title, Subject, Author, Keywords, Description, Category, LastModifiedBy, Company, Application, dan AppVersion sebagai string, ditambah Created dan Modified sebagai nilai TDateTime di mana nol berarti belum diset. Aturan yang menutup celah pewarisan ini satu kalimat saja: tetapkan setiap field pada setiap run, mengambil nilainya dari rekaman bisnis, bukan memercayai apa pun yang kebetulan dibawa template
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open('statement-template.xlsx') <> 1 then
raise Exception.Create('Template not available');
// Timpa setiap field: apa pun yang tidak disentuh akan
// diwarisi dari siapa pun yang mendesain template.
Book.Title := 'Account Statement 2026-06 / ACME Corp';
Book.Subject := 'Monthly account statement';
Book.Author := 'Billing Service 4.2';
Book.LastModifiedBy := 'Billing Service 4.2';
Book.Company := 'Northwind Financial';
Book.Category := 'Customer Delivery';
Book.Keywords := 'statement;billing;2026-06;acct-10024';
Book.Description := 'Generated document - manual edits are not retained';
Book.Created := Now;
Book.Modified := Now;
Book.SaveAs('statement-10024.xlsx');
finally
Book.Free;
end;
end;
Field Keywords membalas lebih banyak pemikiran daripada yang biasanya diberikan orang padanya. Infrastruktur pencarian mengindeksnya apa adanya, Windows Search, SharePoint, dan sebagian besar produk DMS sama saja, sehingga konvensi yang dipisah titik koma dan membawa nomor akun serta periode mengubah setiap workbook yang terkirim menjadi rekaman yang bisa ditemukan tanpa perlu round trip ke database. Jangkauan yang sama itulah yang menjadi jebakannya. Properti ikut berpindah bersama setiap salinan file, jauh melampaui kontrol akses dari sistem yang menuliskannya, sehingga data pribadi tidak boleh berada di sana
Pasangan timestamp ini membawa semantik yang layak dipatok dalam kebijakan, bukan dibiarkan mengikuti kebiasaan. Created seharusnya menandai momen pipeline Anda menghasilkan dokumen itu dan setelahnya tetap beku. Modified adalah field yang diperbarui Excel setiap kali seorang penerima menyimpan file itu, sehingga sebuah perbedaan antara keduanya setelah pengiriman adalah bukti positif bahwa seseorang mengedit workbook itu di hilir, yang menyelesaikan lebih dari satu perselisihan soal angka siapa yang sebenarnya dipegang sebuah spreadsheet yang diteruskan. Satu jebakan bersembunyi dalam keadaan belum-diset: nilainya adalah literal nol, bukan exception dan bukan null, sehingga kode audit harus menguji nol secara eksplisit. Format sebuah TDateTime yang belum diset tanpa penjagaan itu dan log Anda akan dipenuhi tanggal Desember 1899 yang salah dengan penuh percaya diri
DocPropsTouched: Workbook yang Terkirim Tanpa docProps
Sebuah flag read-only, DocPropsTouched, menjadi gerbang bagi writer properti XLSX. Sebuah workbook yang tidak pernah diberi properti apa pun sama sekali tidak menghasilkan bagian docProps; HotXLS menolak menulis sebuah kerangka metadata kosong. Perilaku ini rapi, dan ia punya dua konsekuensi yang layak dijadikan dasar desain
Kode intake di sisi konsumen tidak boleh berasumsi bahwa core.xml ada di setiap paket. Sebuah tool yang mensyaratkan itu secara ketat akan menolak file minimal yang sebenarnya sepenuhnya valid. Dan jika postur kepatuhan Anda menuntut agar setiap dokumen keluar membawa setidaknya identitas generator, tuntutan itu harus diwujudkan menjadi kode, bukan diharapkan sebagai properti format: tetapkan Application dan Author tanpa syarat di jalur penyimpanan, karena sebuah workbook yang tidak disentuh sepenuhnya legal menurut spesifikasi sementara diam-diam melanggar kebijakan Anda
Permukaan XLS Lawas dan Jebakan Comments
Facade BIFF membawa kumpulan field yang lebih tua dan lebih kecil: Title, Subject, Author, Keywords, Comments, Company, dan Manager, ditambah LastSavedBy, sebuah alias dari UserName, yang menuliskan record WRITEACCESS yang ditampilkan Excel ketika pengguna lain sedang mengunci file tersebut
var
Legacy: IXLSWorkbook; // interface reference-counted: tanpa Free manual
begin
Legacy := TXLSWorkbook.Create;
if Legacy.Open('archive-1999.xls') <= 0 then
raise Exception.Create('Cannot open archive file');
Legacy.Title := 'FY1999 ledger (migrated copy)';
Legacy.Author := 'Archive Migration Batch';
Legacy.Company := 'Northwind Financial';
Legacy.Comments := 'Migrated 2026-06-11; source retained in cold storage';
Legacy.LastSavedBy := 'migration-svc'; // record WRITEACCESS BIFF
Legacy.SaveAs('archive-1999-stamped.xls');
end;
Satu benturan penamaan menyebabkan kebingungan yang berulang. Properti Comments tingkat dokumen di sini adalah catatan bebas yang ditampilkan di dialog properti file. Itu sama sekali tidak berhubungan dengan komentar sel, yang merupakan objek lapisan gambar yang dilekatkan ke rentang melalui API yang sepenuhnya terpisah. Sebuah code review yang menerima "kami sudah menulis Comments" tanpa memeriksa yang mana yang dimaksud telah menerima klaim tentang fitur yang salah, dan itu terjadi lebih sering daripada yang tersirat dari nama yang sama itu. Keduanya hanya berbagi empat huruf, bukan satu byte pun ruang penyimpanan
Membaca Metadata saat Intake, dan Celah Probe
Pembacaan bersifat simetris. Setelah Open, properti yang sama kembali terisi dari file itu, yang mengubah audit metadata workbook yang masuk menjadi sebuah loop singkat
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open(FileName) = 1 then
begin
Writeln(Format('%s | title="%s" author="%s" created=%s',
[ExtractFileName(FileName), Book.Title, Book.Author,
FormatDateTime('yyyy-mm-dd', Book.Created)]));
if Book.Created = 0 then
Writeln(' no creation date recorded');
end;
finally
Book.Free;
end;
end;
Rencanakan seputar satu keterbatasan sambil melakukannya. Tidak ada probe khusus properti saja. GetSheetNames bisa mendaftar sheet tanpa memuat sebuah workbook, tetapi membaca Title atau Author berarti sebuah Open penuh, sehingga triase metadata di seluruh arsip besar membayar biaya parse penuh pada setiap file. Di sisi BIFF Anda bisa memangkas biaya itu untuk audit read-only dengan menyetel _DisableGraphics menjadi true sebelum membuka, yang sepenuhnya melewati lapisan gambar. Itu cocok untuk sebuah loop yang hanya membaca properti dan statistik sel, dan itu justru salah pada saat instance yang sama mungkin akan menyimpan, karena konten gambar yang dilewatkan itu akan hilang. Ketika struktur sheet saja sudah bisa memfilter awal sebuah himpunan, ekspor satu-sheet menjadi hal yang jelas untuk dilewati, teknik murah dalam artikel kami tentang listing sheet dan inspeksi ringan memangkas berapa banyak file yang mencapai tahap mahal itu. Dan pada job stamping massal, di mana ribuan output ditulis alih-alih diperiksa, pola throughput sisi tulis dalam artikel kami tentang streaming write untuk job batch berlaku tanpa perubahan, karena penetapan properti tidak menambah apa pun yang terukur pada waktu penyimpanan
Menyeberangi Format dan Menahan Kebocoran
Properti melakukan round-trip dengan bersih di dalam satu facade saja: buka sebuah .xlsx, edit, simpan, dan himpunannya kembali utuh. Menyeberangi format adalah titik di mana asumsi kesetaraan itu pecah, karena himpunan field BIFF dan OOXML tidak sejajar satu-lawan-satu. BIFF punya Manager dan tidak punya timestamp; OOXML punya Category, Description, dan pasangan Created/Modified. Sebuah converter yang menyalin secara membabi buta akan kehilangan apa pun yang tidak bisa ditampung format tujuan, jadi petakan field-nya secara eksplisit dan taruh pemetaan itu di dalam checklist konversi Anda, berdampingan dengan segala sesuatu lain yang tidak selamat dalam perjalanan itu
Kebocoran yang dibuka oleh pewarisan template berjalan ke arah sebaliknya: informasi yang sama sekali tidak Anda maksudkan untuk dikirim keluar. Nama author, label proyek internal yang tersimpan di keyword, sebuah judul draft yang tidak pernah dibersihkan siapa pun. Disiplin timpa-semuanya dari generator di atas adalah keseluruhan pertahanannya, dan itu layak diverifikasi dengan cara yang akan dilakukan orang luar, dengan membuka dialog Properties yang bisa dijangkau pelanggan mana pun atau dengan meng-unzip .xlsx dan membaca docProps/core.xml langsung dari paketnya. Apa yang Anda lihat di sana persis sama dengan apa yang dilihat setiap indexer di hilir
Visibilitas di hilir itu juga alasan mengapa beberapa field layak mendapat lebih banyak perhatian daripada yang lain. Title, Author, Keywords (yang muncul sebagai Tags), dan Comments atau Description membawa sebagian besar bobot pengindeksan di SharePoint dan Windows Search. Sebuah Title yang sungguh-sungguh berbeda per dokumen, membawa periode dan akunnya, memberi lebih banyak manfaat bagi kemudahan pencarian daripada skema penamaan folder mana pun yang ditumpuk di atasnya, dan biayanya hanya satu penetapan per penyimpanan
Properti dokumen adalah polesan profesional paling murah yang bisa dibawa sebuah workbook hasil generate, dan sekaligus cacat yang paling sering terkirim ketika tidak ada yang bertanggung jawab atasnya. Kedua permukaan properti yang dijelaskan di sini adalah bagian dari HotXLS Delphi Component, yang menulisnya secara native untuk XLS dan XLSX tanpa otomatisasi Excel