ثلاث مجموعات من إعدادات ورقة العمل لا علاقة لها بقيم الخلايا وكل العلاقة بكيفية تصرف الملف بعد مغادرته لكودك. حماية الورقة تقرر أي الخلايا يستطيع المستخدم تحريرها بعد أن تسلّم المصنف. إعداد الصفحة يثبّت الاتجاه وحجم الورق والهوامش. إعدادات الطباعة (صفوف العناوين المكررة، والتحجيم، وفواصل الصفحات اليدوية) تتحكم في كيفية هبوط شبكة ذات طول اعتباطي على الورق. لا شيء من هذه الثلاثة يظهر عندما تلقي نظرة سريعة على البيانات في عارض، وكل الثلاثة تنكسر بهدوء في الميدان عندما تكون خاطئة. HotXLS، مكتبة جداول بيانات أصلية لـDelphi وC++Builder، تكشف السطح الكامل لملفات .xls و.xlsx، وهذا يعني أنها تستنسخ أيضًا كل قاعدة غير بديهية من قواعد Excel المطبوخة داخل ذلك السطح
أول تلك القواعد يتعثر بها الجميع تقريبًا أول مرة يحمون فيها ورقة مولَّدة. استدع Protect وفجأة لا يستطيع أحد الكتابة في أي خلية، بما في ذلك أعمدة الإدخال التي بنيت المصنف حولها. لا شيء في كودك لمس تلك الأعمدة، وهذا بالضبط سبب حدوث الأمر
كل خلية تولد مقفلة
يعرّف ECMA-376 خاصية locked كجزء من سجل تنسيق الخلية، لا كخاصية من خصائص الحماية نفسها، وقيمتها الافتراضية true. حماية الورقة هي ببساطة المفتاح الذي يجعل هذه العلامة قابلة للتطبيق. لذا فإن الشبكة بأكملها تحمل علامة قفل منذ لحظة وجودها، خامدة، واستدعاء Protect يفعّلها كلها دفعة واحدة. الحل هو ضبط الترتيب عمدًا: ابنِ التخطيط، ثم افتح أقفال النطاقات التي يجب أن يحررها المستخدمون صراحة، واحمِ في الأخير
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Timesheet');
// ... صف الترويسة، وعمود الاسم، وصيغ المعدل تُكتب هنا ...
Sheet.Range['B2:B50'].SetLocked(False); // هنا يُدخل الموظفون ساعاتهم
Sheet.Range['F2:F50'].SetFormulaHidden(True); // إبقاء حساب المعدل خاصًا
Sheet.Protect('review-2026'); // الآن علامات القفل تسري
Book.SaveAs('timesheet.xlsx');
finally
Book.Free;
end;
SetFormulaHidden تفعل شيئًا منفصلًا يسهل إغفاله: أثناء تفعيل الحماية، تظل الخلية تعرض قيمتها المحسوبة، لكن شريط الصيغة لا يعرض شيئًا. هذا مهم عندما تضمّن صيغة أسعار فوترة، أو هوامش ربح، أو أوزان تقييم لا تريد تسليمها لكل من ينقر على مجموع. في واجهة XLS يُعبَّر عن النية نفسها لكل نطاق عبر IXLSRange.Locked وFormulaHidden. ورقة العمل هناك تحمل أيضًا خمس عشرة علامة من نوع Allow* (AllowSort وAllowAutoFilter وAllowFormatCells وبقيتها)، لذا يمكن لورقة محمية أن تُرتَّب وتُصفَّى مع ذلك بدلًا من أن تتجمد كمعرض مختوم
ما الذي تحميه كلمة مرور الحماية فعليًا
كلا الصيغتين تخزّن كلمة مرور حماية الورقة والمصنف كتجزئة قديمة من 4 أرقام سداسية عشرية. ستة عشر بتًا تعني أن سلاسل لا حصر لها تتصادم مع أي كلمة مرور معطاة، وأدوات إزالتها على بُعد بحث واحد. عامل الحماية كحزام أمان ضد التعديلات العرضية، لا كتحكم بالوصول. إنها الأداة الصحيحة لمنع المراجعين من الكتابة فوق عمود الصيغ، والأداة الخاطئة لأي شيء يتضمن كلمة سري
خطوة أعلى، ProtectWorkbook في واجهة XLSX يقفل بنية المصنف، وهذا يمنع إضافة الأوراق أو إعادة تسميتها أو حذفها أو إعادة ترتيبها. اضبطها كلما كانت قائمة الأوراق نفسها عقدًا مع محلل لاحق يفهرس الأوراق بالاسم أو بالموضع. ورقة أُعيدت تسميتها تكسر الاستيراد في الجهة الأخرى بنفس يقين عمود محذوف. واجهة XLS تعكس نفس الطبقات عبر TXLSWorkbook.Protect على مستوى المصنف واستدعاءات Protect لكل ورقة، بالإضافة إلى خاصية isProtected للكود الذي يحتاج فحص ملف موروث قبل تعديل أي شيء فيه
عندما يكون المطلوب سرية حقيقية، تتغير الآلية بالكامل. SaveAsEncrypted تنتج حزمة مشفّرة بـAES وفق مخطط التشفير القياسي ECMA-376، المغطى بالتفصيل في دليل خرج XLSX المحمي بـAES، وواجهة XLS القديمة تكتب وتقرأ ملفات .xls مشفّرة بـRC4 عبر EncryptionPassword والحمولة الزائدة بكلمة مرور لـOpen. الفرق ليس أكاديميًا. ورقة محمية تنتقل بنص صريح، فأي أداة أرشفة مضغوطة يمكنها قراءة قيم خلاياها، بينما الحزمة المشفّرة غير قابلة للقراءة دون كلمة المرور. سطر تدقيق يقول "يجب حماية ملف الرواتب" يعني في الغالب دائمًا التشفير، أيًا كانت المفردات التي يستخدمها
إعداد الصفحة جزء من عقد المستند
سلوك الطباعة غير مرئي على الشاشة، وهذا هو سبب وصوله معطوبًا هذا القدر من التكرار. في اللحظة التي يطبع فيها عميل المصنف، أو يصدّره كـPDF لمدقق حسابات، تتحول الهوامش والتحجيم والعناوين المكررة إلى متطلبات وظيفية لم يختبرها أحد. في واجهة XLSX تتعلق هذه الإعدادات مباشرة بورقة العمل:
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'; // مرجع مجرد: لا اسم ورقة هنا
Sheet.PrintTitleRows := '$1:$1'; // صف الترويسة يتكرر في كل صفحة
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0; // ينمو نزولًا مع نمو البيانات
Sheet.PrintGridlines := False;
سطران من تلك الأسطر يخفيان فخاخًا. سلاسل الترويسة والتذييل تستخدم رموز تنسيق Excel: &P للصفحة الحالية، و&N لإجمالي العدد، مع &L و&C و&R لمخاطبة الأقسام الثلاثة صراحة. الفخ الآخر هو PrintArea، الذي يأخذ مرجع خلية مجردًا عن قصد. يخزّنه HotXLS دون تأهيل ويضيف بادئة اسم الورقة عند كتابة الملف، لذا فإن تمرير 'Timesheet!$A$1:$F$60' بنفسك ينتج مرجعًا مزدوج التأهيل ومشوَّهًا. نفس الحذر ينطبق طبقة أدنى: مناطق الطباعة وعناوين الطباعة تُحفظ كأسماء معرَّفة مدمجة هي _xlnm.Print_Area و_xlnm.Print_Titles، لذا لا تضف أبدًا إدخالات _xlnm.* عبر DefinedNames يدويًا، وإلا تنازعت الآليتان على نفس الفتحة
تحجيم ينجو من أحجام بيانات الإنتاج
المزيج FitToWidth := 1 مع FitToHeight := 0 يُقرأ كـ"لائم الأعمدة دائمًا عبر صفحة واحدة، ثم خذ ما يلزم من صفحات نزولًا بقدر ما تحتاج البيانات"، وهو الافتراضي الصحيح لأي تقرير يتغير عدد صفوفه. الفخ هو ضبط نسبة مئوية ثابتة أو زوج ملاءمة صفحة مقابل ملف اختبار من ثلاثين صفًا: غذِّ نفس الإعدادات بستمئة صف إنتاجي فينفجر الخرج إلى عشرات الصفحات المقصوصة أو ينكمش دون حد القراءة. حجّم العرض، ودع الطول ينمو، وكرّر صف الترويسة عبر PrintTitleRows حتى تبقى الصفحة السابعة عشرة مقروءة بمفردها
الفواصل اليدوية تتبع نفس انضباط إعادة التوليد الذي يتبعه كل شيء آخر في مصنف مولَّد. AddRowBreak(BeforeRow) تبدأ صفحة جديدة قبل حد قسم، لكن عندما يُعاد تشغيل المولِّد وتتحرك الصفوف، يهبط فاصل قديم في منتصف الجدول. استدع ClearAllPageBreaks أولًا، ثم أعد إضافة الفواصل محسوبةً من عدّادات صفوف المولِّد نفسه بدلًا من ترقيع المواضع القديمة. في واجهة XLS تعيش الضوابط المكافئة على Sheet.PageSetup (الاتجاه، حجم الورق، الهوامش، سلاسل الترويسة والتذييل، الملاءمة إلى عدد صفحات)، مع RepeatRows وRepeatColumns تغطيان عناوين الطباعة
التحقق من النتيجة قبل أن يفعل العميل
أخطاء الحماية والطباعة تشترك في خاصية واحدة: من التافه التحقق منها يدويًا، ومع ذلك يكاد لا يُتحقق منها أبدًا. افتح الملف المولَّد في Excel وأمضِ عليه تسعين ثانية. اكتب في خلية إدخال وتأكد من أنها تقبل ضغطة المفتاح؛ واكتب في خلية مقفلة وتأكد من ظهور مطالبة الحماية؛ وتحقق من أن صيغة مخفية تترك شريط الصيغة فارغًا. ثم شغّل معاينة الطباعة مقابل مجموعة بيانات بحجم الإنتاج، لا عيّنة من ثلاثين صفًا، واقرأ عدد الصفحات، وصف العناوين المتكرر، وترقيم التذييل. المعاينة هي الخطوة التي تسدد ثمنها بنفسها، لأن هندسة الطباعة تعتمد على إعدادات لا عرض مرئي لها على الشاشة، وبعيدًا عن طابعة فعلية فهي المكان الوحيد الذي يصبح فيه خطأ التحجيم مرئيًا على الإطلاق
إعداد أخير يُكمل المراجعة. FreezePane(ACol, ARow) يبقي كتلة الترويسة في مجال الرؤية بينما يمرّر مراجع الصفحة. هذا سلوك شاشة لا سلوك طباعة، لكن المراجع يحكم على المُسلَّم بأكمله دفعة واحدة. ومصنف يبدأ حياته كتخطيط يحافظ عليه مصمم يحصل على معظم هذا مجانًا: سير عمل توليد التقارير من قالب يبقي إعداد الصفحة داخل القالب، حيث ضبطه إنسان مقابل طابعة حقيقية، ويترك للكود مهمة ملء البيانات وإعادة تطبيق الحماية بمجرد استقرار التخطيط
HotXLS مكتبة جداول بيانات Object Pascal أصلية لـDelphi وC++Builder؛ المرجع الكامل لواجهة برمجة الحماية وإعداد الصفحة موجود على صفحة منتج HotXLS Delphi Component