Çalışma sayfası ayarlarının üç grubu hücre değerleriyle hiç ilgili değildir ve tamamen dosyanın kodunuzdan çıktıktan sonra nasıl davranacağıyla ilgilidir. Sayfa koruması, çalışma kitabını teslim ettikten sonra bir kullanıcının hangi hücreleri düzenleyebileceğini belirler. Sayfa yapısı; yönlendirmeyi, kağıt boyutunu ve kenar boşluklarını sabitler. Yazdırma ayarları (yinelenen başlık satırları, ölçeklendirme ve manuel sayfa sonları), rastgele uzunluktaki bir ızgaranın kağıda nasıl düşeceğini kontrol eder. Üçü de verileri bir görüntüleyicide incelediğinizde görünmez ve yanlış olduklarında sahada sessizce bozulurlar. Yerel bir Delphi ve C++Builder elektronik tablo kütüphanesi olan HotXLS, .xls ve .xlsx için eksiksiz yüzeyi sunar; bu da bu yüzeye gömülü her mantığa aykırı Excel kuralını yeniden ürettiği anlamına gelir
Bu kurallardan ilki, oluşturulmuş bir sayfayı ilk kez korumaya çalışan hemen hemen herkesi tökezletir. Protect çağrısı yaptığınızda birdenbire hiç kimse, çalışma kitabını etrafında oluşturduğunuz girdi sütunları da dahil olmak üzere hiçbir hücreye yazamaz hale gelir. Kodunuzdaki hiçbir şey bu sütunlara dokunmadı ve bunun gerçekleşmesinin nedeni de tam olarak budur
Her hücre kilitli doğar
ECMA-376, locked durumunu korumanın bir özelliği olarak değil, bir hücrenin biçimlendirme kaydının bir parçası olarak tanımlar ve varsayılan olarak doğrudur (true). Sayfa koruması yalnızca bayrağın uygulanabilir olmasını sağlayan anahtardır. Dolayısıyla, tüm ızgara var olduğu andan itibaren uykuda bir kilit bayrağı taşır ve Protect çağrısı hepsini aynı anda etkinleştirir. Çözüm, sırayı kasıtlı olarak ayarlamaktır: Düzen düzenini oluşturun, kullanıcıların düzenlemesi gereken aralıkların kilidini açıkça açın ve en son koruyun
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Timesheet');
// ... başlık satırı, isim sütunu ve oran formülleri buraya yazılır ...
Sheet.Range['B2:B50'].SetLocked(False); // personel buraya saatleri yazar
Sheet.Range['F2:F50'].SetFormulaHidden(True); // oran hesaplama matematiğini gizli tut
Sheet.Protect('review-2026'); // şimdi kilit bayrakları ısıyor
Book.SaveAs('timesheet.xlsx');
finally
Book.Free;
end;
SetFormulaHidden ayrı ve gözden kaçırılması kolay bir şey yapar: Koruma aktifken hücre hala hesaplanan değerini gösterir ancak formül çubuğu hiçbir şey göstermez. Bu, bir formül fatura oranlarını, kar marjlarını veya bir toplama tıklayan her alıcıya vermek istemeyeceğiniz puanlama ağırlıklarını gömdüğünde önem taşır. XLS arayüzünde aynı niyet, aralık başına IXLSRange.Locked ve FormulaHidden aracılığıyla ifade edilir. Oradaki çalışma sayfası ayrıca on beş adet Allow* bayrağı (AllowSort, AllowAutoFilter, AllowFormatCells, ve diğerleri) taşır, böylece korumalı bir sayfa mühürlü bir sergi gibi donmak yerine hala sıralanabilir ve filtrelenebilir
Koruma parolası gerçekte neyi korur?
Her iki biçim de sayfa ve çalışma kitabı koruma parolasını 4 haneli onaltılık (hex) eski bir karma olarak saklar. On altı bit, sayısız dizeyle herhangi bir parolanın çakışabileceği anlamına gelir ve temizleme araçları bir arama uzağınızdadır. Korumayı erişim kontrolü olarak değil, kazara yapılan düzenlemelere karşı bir emniyet kemeri olarak ele alın. İnceleyenlerin formül sütununun üzerine yazmasını durdurmak için doğru araçtır, ancak "gizli" kelimesini içeren herhangi bir şey için yanlış araçtır
Bir seviye yukarıda, XLSX arayüzündeki ProtectWorkbook çalışma kitabı yapısını kilitler; bu da sayfaların eklenmesini, yeniden adlandırılmasını, silinmesini veya yeniden sıralanmasını önler. Sayfa listesinin kendisi, sayfalara ada veya konuma göre dizin oluşturan aşağı akıştaki bir ayrıştırıcıyla yapılan bir sözleşme olduğunda bunu ayarlayın. Yeniden adlandırılan bir sayfa, karşı taraftaki içe aktarmayı tıpkı silinen bir sütunun yaptığı gibi kesinlikle bozar. XLS arayüzü, çalışma kitabı düzeyinde TXLSWorkbook.Protect ve sayfa başına Protect çağrıları ile katmanlamayı yansıtır; ayrıca bir dosyayı değiştirmeden önce incelemesi gereken kodlar için bir isProtected özelliği içerir
Gereksinim gerçek gizlilik olduğunda, mekanizma tamamen değişir. SaveAsEncrypted, AES korumalı XLSX çıktısı kılavuzunda derinlemesine ele alınan ECMA-376 Standart Şifreleme şeması altında AES şifreli bir paket üretir ve eski XLS arayüzü, EncryptionPassword ve Open yönteminin parola aşırı yüklemesi aracılığıyla RC4 şifreli .xls dosyaları yazar ve okur. Bu fark akademik değildir. Korumalı bir sayfa düz metin olarak hareket eder, bu nedenle herhangi bir zip aracı hücre değerlerini okuyebilir, oysa şifrelenmiş bir paket parola olmadan okunamaz. Hangi kelime dağarcığını kullanırsa kullansın, "bordro dosyası korunmalıdır" diyen bir denetim satırı neredeyse her zaman şifreleme anlamına gelir
Sayfa yapısı belge sözleşmesinin bir parçasıdır
Yazdırma davranışı ekranda görünmez, bu yüzden bu kadar sık bozuk olarak gönderilir. Bir müşteri çalışma kitabını yazdırdığı veya bir denetçi için PDF'ye aktardığı anda kenar boşlukları, ölçeklendirme ve yinelenen başlıklar kimsenin test etmediği işlevsel gereksinimlere dönüşür. XLSX arayüzünde bu ayarlar doğrudan çalışma sayfasından asılır:
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'; // yalın başvuru: burada sayfa adı yok
Sheet.PrintTitleRows := '$1:$1'; // başlık satırı her sayfada tekrarlanır
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0; // veri büyüdükçe aşağı doğru büyür
Sheet.PrintGridlines := False;
Bu satırlardan ikisi tuzaklar gizler. Üstbilgi ve altbilgi dizgeleri Excel'in biçimlendirme kodlarını kullanır: Üç bölümü açıkça adreslemek için geçerli sayfa için &P, toplam sayfa sayısı için &N ve &L, &C, &R. Diğer tuzak, kasıtlı olarak yalın bir hücre referansı alan PrintArea'dir. HotXLS bunu niteliksiz olarak saklar ve dosyayı yazarken sayfa adını ön ek olarak ekler, bu nedenle kendiniz 'Timesheet!$A$1:$F$60' geçirmek çift nitelikli, hatalı biçimlendirilmiş bir referans üretir. Aynı dikkat bir katman aşağıda da geçerlidir: Yazdırma alanları ve yazdırma başlıkları yerleşik tanımlı adlar olan _xlnm.Print_Area ve _xlnm.Print_Titles olarak kalıcı hale getirilir, bu nedenle asla DefinedNames aracılığıyla elle _xlnm.* girişleri eklemeyin, aksi takdirde iki mekanizma aynı yuva için kavga edecektir
Üretim veri hacimlerinde ayakta kalan ölçeklendirme
FitToWidth := 1 ile FitToHeight := 0 kombinasyonu "sütunları her zaman bir sayfaya sığdır, ardından verilerin ihtiyaç duyduğu kadar çok sayfayı aşağı doğru al" olarak okunur ve satır sayısı değişen her rapor için doğru varsayılandır. Tuzak, sabit bir yüzdeyi veya sayfaya sığdırma çiftini otuz satırlık bir test dosyasına karşı ayarlamaktır: Aynı ayarları altı yüz üretim satırına besleyin; çıktı ya düzinelerce kesilmiş sayfaya patlar ya da okunabilirliğin altına düşer. Genişliği ölçeklendirin, uzunluğun büyümesine izin verin ve başlık satırını PrintTitleRows aracılığıyla tekrarlayın, böylece sayfa on yedi hala kendi başına okunabilir kalır
Manuel kesmeler (breaks), oluşturulmuş bir çalışma kitabındaki diğer her şeyle aynı yenilenme disiplinini takip eder. AddRowBreak(BeforeRow) bir bölüm sınırından önce yeni bir sayfa başlatır, ancak oluşturucu yeniden çalıştığında ve satırlar kaydığında, bayat bir kesme tablonun ortasına denk gelir. Önce ClearAllPageBreaks çağrısı yapın, ardından eski konumları yamamak yerine oluşturucunun kendi satır sayaçlarından hesaplanan kesmeleri yeniden ekleyin. XLS arayüzünde eşdeğer kontroller, yazdırma başlıklarını kapsayan RepeatRows ve RepeatColumns ile birlikte Sheet.PageSetup üzerinde (yönlendirme, kağıt boyutu, kenar boşlukları, üstbilgi ve altbilgi dizeleri, sayfalara sığdırma) yaşar
Sonucu müşteriden önce kontrol etme
Koruma ve yazdırma hataları ortak bir özelliğe sahiptir: Elle doğrulanması çok kolaydır ancak neredeyse hiç doğrulanmazlar. Oluşturulan dosyayı Excel'de açın ve üzerinde doksan saniye harcayın. Bir girdi hücresine yazın ve tuş vuruşunu kabul ettiğini onaylayın; kilitli bir hücreye yazın ve koruma isteminin göründüğünü onaylayın; gizli bir formülün formül çubuğunu boş bıraktığını kontrol edin. Ardından, otuz satırlık bir örnek yerine üretim boyutunda bir veri kümesine karşı Yazdırma Önizlemeyi çalıştırın ve sayfa sayısını, yinelenen başlık satırını ve altbilgi numaralandırmasını okuyun. Önizleme, kendini ödeyen adımdır, çünkü yazdırma geometrisi ekranda işlenmeyen ayarlara bağlıdır ve fiziksel bir yazıcı olmaması durumunda bir ölçeklendirme hatasının görünür hale geldiği tek yerdir
Son bir ayar incelemeyi tamamlar. FreezePane(ACol, ARow), bir inceleyen kaydırırken başlık bloğunu görünümde tutar. Bu, yazdırma davranışından ziyade ekran davranışıdır ancak bir inceleyen tüm teslimatı bir kerede yargılar. Ve bir tasarımcı tarafından korunan bir düzen olarak hayata başlayan bir çalışma kitabı bunların çoğunu ücretsiz olarak alır: şablon rapor oluşturma iş akışı sayfa yapısını, bir insanın gerçek bir yazıcıya karşı ayarladığı şablonda tutar ve düzen oturduktan sonra verileri doldurma ve korumayı yeniden uygulama işini koda bırakır
HotXLS, Delphi ve C++Builder için yerel bir Object Pascal elektronik tablo kütüphanesidir; eksiksiz koruma ve sayfa yapısı API referansı HotXLS Bileşeni ürün sayfasında yer almaktadır