Tiga kelompok pengaturan worksheet sama sekali tidak berkaitan dengan nilai sel, tetapi sepenuhnya berkaitan dengan bagaimana file itu berperilaku setelah meninggalkan kode Anda. Proteksi sheet menentukan sel mana yang boleh diedit pengguna setelah workbook diserahkan. Page setup menetapkan orientasi, ukuran kertas, dan margin. Pengaturan pencetakan (baris judul yang berulang, penskalaan, dan pemisah halaman manual) mengontrol bagaimana grid dengan panjang sembarang mendarat di atas kertas. Tak satu pun dari ketiganya terlihat ketika Anda sekadar melihat sekilas data dalam viewer, dan ketiganya bisa rusak diam-diam di lapangan ketika salah diatur. HotXLS, pustaka spreadsheet native untuk Delphi dan C++Builder, mengekspos seluruh permukaan pengaturan ini untuk .xls maupun .xlsx, yang berarti ia juga mereproduksi setiap aturan Excel yang berlawanan dengan intuisi yang tertanam di dalamnya
Aturan pertama dari semua itu menjebak hampir semua orang pada kali pertama mereka memproteksi sheet hasil generate. Panggil Protect dan tiba-tiba tidak seorang pun bisa mengetik ke sel mana pun, termasuk kolom input yang menjadi alasan workbook itu dibangun. Tidak ada satu pun bagian kode Anda yang menyentuh kolom-kolom itu, dan justru itulah sebabnya hal ini terjadi
Setiap Sel Lahir dalam Keadaan Terkunci
ECMA-376 mendefinisikan locked sebagai bagian dari record pemformatan sel, bukan sebagai properti dari proteksi itu sendiri, dan nilai defaultnya adalah true. Proteksi sheet hanyalah saklar yang membuat flag itu benar-benar berlaku. Jadi seluruh grid membawa flag lock sejak ia ada, dalam keadaan dorman, dan panggilan ke Protect mengaktifkan semuanya sekaligus. Perbaikannya adalah menetapkan urutan secara sengaja: bangun layout, buka kunci secara eksplisit rentang yang harus bisa diedit pengguna, lalu proteksi paling terakhir
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Timesheet');
// ... baris header, kolom nama, dan formula rate ditulis di sini ...
Sheet.Range['B2:B50'].SetLocked(False); // staf mengetik jam kerja di sini
Sheet.Range['F2:F50'].SetFormulaHidden(True); // jaga agar perhitungan rate tetap privat
Sheet.Protect('review-2026'); // sekarang flag lock mulai berlaku
Book.SaveAs('timesheet.xlsx');
finally
Book.Free;
end;
SetFormulaHidden melakukan sesuatu yang terpisah dan mudah terlewat: selagi proteksi aktif, sel tetap menampilkan nilai hasil perhitungannya, tetapi formula bar tidak menampilkan apa-apa. Ini penting ketika sebuah formula menyisipkan tarif billing, margin, atau bobot penilaian yang tidak ingin Anda serahkan begitu saja kepada setiap penerima yang mengklik sebuah total. Pada facade XLS, maksud yang sama diungkapkan per rentang melalui IXLSRange.Locked dan FormulaHidden. Worksheet di sana juga membawa lima belas flag Allow* (AllowSort, AllowAutoFilter, AllowFormatCells, dan lainnya), sehingga sheet yang diproteksi tetap bisa disortir dan difilter, alih-alih dibekukan menjadi barang pajangan yang tersegel
Apa yang Sebenarnya Dilindungi oleh Password Proteksi
Kedua format menyimpan password proteksi sheet dan workbook sebagai hash lawas 4 digit heksadesimal. Enam belas bit berarti sangat banyak string yang bertabrakan dengan password mana pun, dan tool penghapusnya hanya sejauh satu pencarian. Perlakukan proteksi sebagai sabuk pengaman terhadap edit yang tidak disengaja, bukan sebagai kontrol akses. Ini adalah alat yang tepat untuk mencegah reviewer mengetik menimpa kolom formula, dan alat yang keliru untuk apa pun yang menyangkut kata rahasia
Satu tingkat di atasnya, ProtectWorkbook pada facade XLSX mengunci struktur workbook, yang mencegah penambahan, penggantian nama, penghapusan, atau pengurutan ulang sheet. Set ini setiap kali daftar sheet itu sendiri merupakan kontrak dengan parser di hilir yang mengindeks sheet berdasarkan nama atau posisi. Sheet yang berganti nama merusak proses import di sisi lain sama pastinya dengan kolom yang terhapus. Facade XLS mencerminkan lapisan yang sama melalui TXLSWorkbook.Protect di tingkat workbook dan panggilan Protect per sheet, ditambah properti isProtected untuk kode yang perlu memeriksa file warisan sebelum memodifikasi apa pun
Ketika kebutuhannya adalah kerahasiaan yang sesungguhnya, mekanismenya berubah total. SaveAsEncrypted menghasilkan paket terenkripsi AES di bawah skema ECMA-376 Standard Encryption, dibahas mendalam dalam panduan output XLSX terproteksi AES, dan facade XLS lawas menulis serta membaca file .xls terenkripsi RC4 melalui EncryptionPassword dan overload password dari Open. Perbedaannya bukan sekadar teoretis. Sheet yang diproteksi tetap berjalan dalam cleartext, sehingga tool zip apa pun bisa membaca nilai selnya, sedangkan paket terenkripsi tidak bisa dibaca tanpa password. Baris audit yang berbunyi "file payroll harus diproteksi" hampir selalu berarti enkripsi, apa pun istilah yang kebetulan dipakainya
Page Setup Adalah Bagian dari Kontrak Dokumen
Perilaku pencetakan tidak terlihat di layar, itulah sebabnya ia begitu sering dirilis dalam keadaan rusak. Begitu pelanggan mencetak workbook, atau mengekspornya ke PDF untuk seorang auditor, margin, penskalaan, dan judul yang berulang berubah menjadi persyaratan fungsional yang tidak pernah diuji siapa pun. Pada facade XLSX, pengaturan ini menggantung langsung pada worksheet:
Sheet.PageLandscape := True;
Sheet.PaperSize := xlsxPaperA4;
Sheet.SetPageMargins(0.5, 0.5, 0.75, 0.75, 0.3, 0.3);
Sheet.CenterHeader := 'Monthly Timesheet';
Sheet.RightFooter := 'Page &P of &N';
Sheet.PrintArea := '$A$1:$F$60'; // referensi polos: tanpa nama sheet di sini
Sheet.PrintTitleRows := '$1:$1'; // baris header berulang di setiap halaman
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0; // tumbuh ke bawah seiring bertambahnya data
Sheet.PrintGridlines := False;
Dua dari baris tersebut menyembunyikan jebakan. String header dan footer menggunakan kode pemformatan Excel: &P untuk halaman saat ini, &N untuk jumlah total, dengan &L, &C, dan &R untuk menunjuk ketiga bagian secara eksplisit. Jebakan lainnya adalah PrintArea, yang sengaja menerima referensi sel polos. HotXLS menyimpannya tanpa kualifikasi dan menambahkan awalan nama sheet saat menulis file, sehingga jika Anda sendiri memberikan 'Timesheet!$A$1:$F$60', hasilnya adalah referensi berkualifikasi ganda yang cacat bentuk. Kehati-hatian yang sama berlaku satu lapis di bawahnya: area cetak dan judul cetak dipersist sebagai defined name bawaan _xlnm.Print_Area dan _xlnm.Print_Titles, jadi jangan pernah menambahkan entri _xlnm.* secara manual melalui DefinedNames, atau kedua mekanisme itu akan berebut slot yang sama
Penskalaan yang Tahan terhadap Volume Data Produksi
Kombinasi FitToWidth := 1 dengan FitToHeight := 0 bisa dibaca sebagai "selalu paskan kolom ke dalam satu halaman, lalu ambil sebanyak apa pun halaman ke bawah sesuai kebutuhan data," dan itu adalah default yang tepat untuk laporan apa pun yang jumlah barisnya bervariasi. Jebakannya adalah menyetel persentase tetap atau pasangan fit-to-page terhadap file uji tiga puluh baris: berikan pengaturan yang sama pada enam ratus baris produksi dan hasilnya bisa meledak menjadi puluhan halaman terpotong atau menyusut di bawah batas keterbacaan. Skalakan lebar, biarkan panjang bertumbuh, dan ulangi baris header melalui PrintTitleRows agar halaman ketujuh belas tetap bisa dibaca dengan sendirinya
Pemisah halaman manual mengikuti disiplin regenerasi yang sama seperti segala sesuatu yang lain dalam workbook hasil generate. AddRowBreak(BeforeRow) memulai halaman baru sebelum batas sebuah bagian, tetapi ketika generator dijalankan ulang dan baris-barisnya bergeser, pemisah yang basi akan mendarat di tengah tabel. Panggil ClearAllPageBreaks lebih dulu, lalu tambahkan kembali pemisah yang dihitung dari counter baris milik generator itu sendiri, alih-alih menambal posisi lama. Pada facade XLS, kontrol yang setara berada di Sheet.PageSetup (orientasi, ukuran kertas, margin, string header dan footer, fit-to-pages), dengan RepeatRows dan RepeatColumns menangani judul cetak
Memeriksa Hasilnya Sebelum Pelanggan yang Melakukannya
Bug proteksi dan bug pencetakan berbagi satu sifat yang sama: keduanya sepele untuk diverifikasi secara manual, dan hampir tidak pernah diverifikasi. Buka file hasil generate di Excel dan luangkan sembilan puluh detik untuk memeriksanya. Ketik ke sel input dan pastikan ia menerima input keyboard; ketik ke sel yang terkunci dan pastikan prompt proteksi muncul; periksa bahwa formula yang disembunyikan membuat formula bar kosong. Lalu jalankan Print Preview terhadap dataset berukuran produksi, bukan sampel tiga puluh baris, dan baca jumlah halaman, baris judul yang berulang, dan penomoran footer-nya. Print Preview adalah langkah yang benar-benar sepadan usahanya, karena geometri pencetakan bergantung pada pengaturan yang tidak dirender di layar, dan selain printer fisik, itulah satu-satunya tempat kesalahan penskalaan pernah bisa terlihat
Satu pengaturan terakhir melengkapi pemeriksaan ini. FreezePane(ACol, ARow) menjaga blok header tetap terlihat selagi reviewer melakukan scroll. Itu perilaku layar, bukan perilaku cetak, tetapi reviewer menilai keseluruhan hasil kerja sekaligus. Dan workbook yang lahir sebagai layout yang dikelola designer mendapatkan sebagian besar dari semua ini secara cuma-cuma: alur kerja pembuatan laporan dari template menjaga page setup tetap berada di dalam template, tempat seorang manusia menyetelnya terhadap printer sungguhan, dan menyerahkan kepada kode hanya tugas mengisi data serta menerapkan ulang proteksi begitu layout sudah mantap
HotXLS adalah pustaka spreadsheet Object Pascal native untuk Delphi dan C++Builder; referensi API lengkap untuk proteksi dan page setup tersedia di halaman produk HotXLS Delphi Component