قاعدة تنسيق شرطي في OOXML شيئان منفصلان يرتديان اسما واحدا الشرط (مقارنة، أو صيغة، أو تطابق نص) يقرر أي الخلايا مؤهلة المظهر (سجل تنسيق تفاضلي، dxf بمصطلحات ECMA-376) يقرر شكل تلك الخلايا يخفي مربع حوار Excel هذا الفاصل بجعلك تملأ الاثنين معا HotXLS لا تفعل ذلك أنشئ قاعدة cellIs من Delphi وتخطَّ النمط، والقاعدة صالحة، والنطاق صحيح، والصيغة تُقيَّم إلى صحيح على الخلايا الصحيحة تماما، ولا يتغير لون شيء، لأن تعليمة القاعدة كانت "صحيح، لا تلوّن شيئا" تلك الفجوة بين الشرط والنتيجة هي أول شيء يجب ضبطه، وهي سبب معظم القواعد التي تبدو صحيحة في Manage Rules ومع ذلك لا تبرز شيئا
تكتب HotXLS التنسيق الشرطي أصليا في كل من ملفات BIFF8 .xls وOOXML .xlsx، وتفعل الشيء نفسه لتشغيلات النص المنسّق ونموذج أنماط الخلايا المجمَّع الميزات الثلاث تتشارك أسلاكا أكثر مما يوحي به سطح الواجهة البرمجية المسطح، والمواضع التي ينحرف فيها الخرج عن القصد عادة ما تكون المفاصل بينها
الشرط يحتاج نتيجة: نمط dxf
في ورقة عمل XLSX، تأتي قواعد المقارنة من AddConditionalFormat، التي تأخذ نطاقا، ومعاملا من TXLSXCfOperator، وصيغة أو قيمة حرفية، ثم تعيد فهرس القاعدة الجديدة داخل مجموعة ConditionalFormats الخاصة بالورقة كائن القاعدة عند ذلك الفهرس يعرض خاصية Style، وهناك يعيش الإبراز اضبط تعبئة عليه وتأخذ الخلايا المؤهلة تلك التعبئة اتركه دون لمس وستكون قد بنيت القاعدة غير المرئية الموصوفة أعلاه
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Idx: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('kpi.xlsx');
Sheet := Book.Sheets[0];
// انحراف سلبي: تعبئة حمراء فاتحة
Idx := Sheet.AddConditionalFormat('D2:D200', xlsxCfOpLessThan, '0');
Sheet.ConditionalFormats[Idx].Style.SetFillBgColor($FFFFC7CE);
// معرّفات الطلبات المكررة تُعلَّم بالطريقة نفسها
Idx := Sheet.AddCondFormatDuplicateValues('A2:A200');
Sheet.ConditionalFormats[Idx].Style.SetFillBgColor($FFFFEB9C);
// قاعدة صيغة مخصصة: أبرز الصفوف حيث الفعلي يفوّت 90% من الهدف
Idx := Sheet.AddCondFormatExpression('B2:B200', '$C2<$B2*0.9');
Sheet.ConditionalFormats[Idx].Style.SetFillBgColor($FFFFC7CE);
Book.SaveAs('kpi-flagged.xlsx');
finally
Book.Free;
end;
end;
الألوان هنا قيم ARGB بـ32 بت، لذا $FFFFC7CE هو "الأحمر الفاتح" في Excel الذي تعرفه من مربع الحوار، مع بايت ألفا معتم كليا في المقدمة قبل RGB كل نوع قاعدة يُطلَق بشرط لكل خلية يتبع نفس شكل الإنشاء ثم التنميط مطابقات النص (AddCondFormatContainsText وAddCondFormatBeginsWith وAddCondFormatEndsWith) تعيد فهرسا تنمّقه لاحقا، وكذلك تفعل AddCondFormatTop10 وAddCondFormatAboveAverage وكاشفا الخلايا الفارغة والخطأ تعلّم النمط مرة واحدة وستتصرف عائلة النص والمقارنة بأكملها بالطريقة نفسها
أشرطة البيانات، ومقاييس الألوان، ومجموعات الأيقونات ترسم نفسها
أنواع القواعد المرئية تعمل بالطريقة المعاكسة تحمل مظهرها داخل تعريف القاعدة وتتجاهل خاصية Style كليا عيّن تعبئة لقاعدة شريط بيانات ولن يحدث شيء، وهو ما يبدو كخلل حتى يتضح التصنيف: AddCondFormatDataBar تأخذ لون الشريط كوسيط مباشر، ومقياسا اللونين والثلاثة ألوان يأخذان لوني نقطتي النهاية بالطريقة نفسها، وAddCondFormatIconSet تختار واحدة من 26 نوع مجموعة أيقونات مثل icsTrafficLights3 لا يوجد سجل نمط منفصل لتنساه هنا، لأنه لا يوجد سجل نمط منفصل على الإطلاق
المعاملات التي تستحق التفكير في هذه الاستدعاءات هي مراسي القيمة، المكتوبة كـTXLSCfValueKind يمكن أن تقع نقطة نهاية شريط أو مقياس عند حد أدنى أو أقصى للنطاق، أو عند رقم حرفي، أو عند نسبة مئوية أو مئين، أو عند نتيجة صيغة الإعدادات الافتراضية، أدنى النطاق وأقصاه، تتصرف جيدا على بيانات عرض توضيحي مرتبة ثم تخونك على بيانات حقيقية بها قيم شاذة: قيمة جامحة واحدة تمدد المقياس وتسطّح كل شريط آخر إلى جذع حين يُراد قراءة لوحة معلومات عبر فترات، ارسِ نقاط النهاية عند أرقام ثابتة أو مئينات بدلا من ذلك، بحيث يعني نصف شريط في مارس نفس الكمية التي يعنيها نصف شريط في أبريل شريط ذاتي القياس قابل للمقارنة بنفسه فقط
كاتب XLS يغطي أربعة أنواع قواعد، لا أكثر
جانب BIFF8 القديم ليس مرآة أصغر لجانب XLSX؛ إنه مجموعة فرعية متعمدة واجهة XLS تستطيع إنشاء أربعة أشكال قواعد شرطية بالضبط، أشرطة البيانات، ومقياس اللونين، ومقياس الثلاثة ألوان، ومجموعات الأيقونات، تُصدَر كسجلات CF12 في الدفق ليس لديها واجهة إنشاء لقواعد cellIs أو التعبير أو النص القواعد من تلك الأنواع الموجودة أصلا في ملف تفتحه تُقرأ وتُحفظ وتُكتَب مرة أخرى دون تغيير، لذا فتح ملف .xls لعميل وإعادة حفظه لا يتلف أبدا التنسيق الذي كان يحمله ما لا تستطيع فعله هو توليد إبراز عتبة من الصفر في .xls الخيارات هناك هي تزييفه بتعبئات خلايا عادية محسوبة في الكود، أو جعل التسليم .xlsx، حيث عائلة القواعد الكاملة متاحة
هذا قيد يجب تسويته قبل وجود طبقة البيانات، لا بعدها، لأنه يغيّر قرار صيغة الملف لأي شيء بشكل لوحة معلومات فريق اختار .xls للتوافق ثم يحدد تقرير مؤشرات أداء بعتبات cellIs قد اختار شيئين لا يتناسبان معا، والوقت الأرخص لملاحظة ذلك هو عند قرار الصيغة لا بعد ثلاثة أسابيع من البناء
تكديس القواعد، والأولوية، والنطاقات المتداخلة
لوحات المعلومات الحقيقية نادرا ما تُشغّل قاعدة واحدة لكل نطاق قد يحمل عمود انحراف شريط بيانات للحجم، وقاعدة cellIs للعتبة الصلبة، وقاعدة تعبير على مستوى الصف فوق الاثنتين للتصعيد كل TXLSXConditionalFormat يعرض قيمة Priority، ويحل Excel القواعد المتنافسة حسب ترتيب الأولوية حين تريد قاعدتان تلوين الخلية نفسها، يُحسَم الفائز برقم تضبطه أنت، لا بأي ترتيب يصادف أن يمرّ عليه مراجع في مربع حوار Manage Rules
عامل الأولوية كما يعامل برنامج رسم ترتيب الطبقات z-order عيّنها عمدا حيثما تستطيع قاعدتان الوصول إلى الخلايا نفسها، واترك فجوات بين القيم كي تنزلق قاعدة لاحقة دون إعادة ترقيم البقية حيث لا يمكن أن تتصادم القواعد، لنقل شريط بيانات محصور في العمود E وقاعدة نص محصورة في العمود G، ترتيب الإنشاء مقبول والأولوية لا تستحق الاهتمام أنفق ذلك الاهتمام على حدود النطاق بدلا من ذلك، لأن الأخطاء المكلفة هنا نادرا ما تكون انعكاسات أولوية إنها نطاقات مثل B2:B200 على تقرير نما إلى 350 صفا، حيث يُعرَض الذيل غير المغطى كخلايا عادية تبدو تماما مثل بيانات سليمة اشتق كل نطاق قاعدة من قيمة عدد الصفوف النهائي نفسها التي تقود سلاسل المخططات ونطاقات التحقق في مكان آخر من المصنف، ويتوقف الذيل عن السقوط
عادة تحقق واحدة تستحق الحفاظ عليها بعد التوليد، افتح الملف في Excel، وحدد النطاق المنسّق، واجتز Manage Rules مرة واحدة لكل تغيير قالب التنسيق الشرطي واحد من المجالات القليلة حيث المُصيِّر الموثوق الوحيد هو التطبيق الذي يستهلك الملف، لذا اختبار وحدة على XML يثبت أن القاعدة كُتبت، لا أن Excel يرسمها كما قصدت دقيقة من الفحص البصري تسد تلك الفجوة
النص المنسّق: تنسيقات عديدة داخل خلية واحدة
خلية نص منسّق في نموذج XLSX تحمل قائمة تشغيلات، حيث كل تشغيل امتداد من النص مع خصائص خط خاصة به تبني القائمة جانبا ككائن TXLSXRichText، وتضيف تشغيلات إليها، ثم تلحق الشيء بأكمله بخلية قاعدة الملكية هي الجزء الذي يعضّ تعيين Cell.RichText يسلّم ملكية ذلك الكائن إلى الخلية، وتحرره الخلية أثناء تدميرها الخاص حرره أنت أيضا وستكون لديك تحرير مزدوج، من النوع الذي يبقى صامتا طوال التشغيل الذي سببه ويظهر كانهيار في مكان غير مرتبط لاحقا بكثير
var
Rich: TXLSXRichText;
Run: TXLSXRichTextRun;
begin
Rich := TXLSXRichText.Create;
Rich.AddRunText('Status: ');
Run := Rich.AddRunText('OVERDUE');
Run.Bold := True;
Run.Color := $FFC00000;
Run.ColorIsAuto := False;
Run := Rich.AddRunText(' (escalated to regional manager)');
Run.Italic := True;
Sheet.Cells[2, 7].RichText := Rich; // الملكية تنتقل إلى الخلية: لا تستدعِ Free
end;
ColorIsAuto := False الصريحة ليست زخرفة اختيارية التشغيل يحمل علم لون تلقائي، ولا يُحترَم تعيين اللون إلا بمجرد مسح ذلك العلم اضبط Color وانسَ ColorIsAuto ويخرج التشغيل عريضا لكن أسود بعناد، دون خطأ يشير إلى السبب التشغيلات تدعم أيضا الشطب، ونسخ التسطير المختلفة، والمحاذاة الرأسية للأس والمنخفض، بينما PlainText يسطّح القائمة بأكملها مرة أخرى إلى سلسلة نصية واحدة حين تحتاج إلى تصدير أو مقارنة محتوى النص
النص المنسّق على مستوى الخلية حصري لـXLSX ليس لدى واجهة XLS واجهة برمجية عامة لكتابته، رغم أن التشغيلات متاحة هناك على التعليقات ومربعات النص عبر TextRuns، وتنجو السلاسل المنسّقة المقروءة من ملف .xls موجود سليمة من رحلة ذهاب وإياب الجاذبية نفسها كما مع التنسيق الشرطي: أي شيء يمزج تنسيقات داخل خلية ينتمي إلى كاتب XLSX
تجمّع الأنماط والإزاحة بواحد التي تُشحَن
تنميط الخلايا العادي في نموذج XLSX يمر عبر مجموعات مجمَّعة على المصنف Fonts.Add وFills.AddSolid وBorders.Add كل منها يسجّل تعريفا ويعيد فهرسه في التجمّع تلك الفهارس تبدأ من صفر خصائص جانب الخلية التي تستهلكها، مثل FontIndex، تحجز صفر لـ"الافتراضي"، لذا القيمة التي تعيّنها لخلية هي فهرس التجمّع زائد واحد
HeaderFont := Book.Fonts.Add('Calibri', 11, True, False); // فهرس التجمع، يبدأ من صفر
for Col := 1 to 6 do
Sheet.Cells[1, Col].FontIndex := HeaderFont + 1; // فهرس الخلية، يبدأ من واحد
أسقط + 1 وسيعود كل عنوان إلى الخط الافتراضي لا استثناء ولا تحذير، فقط مصنف يبدو وكأن أحدا لم ينمّقه الخطأ من الدرجة الثانية يختبئ في الحلقة: استدعاء Fonts.Add مرة لكل صف تعريفات الخطوط المتطابقة تُزال تكراريا، لذا الملف ليس تالفا، لكن العمل مهدور، وتجمّع المحاذاة تحديدا يعيد كائنا جديدا في كل استدعاء بدل طي التكرارات ابنِ الحفنة من الأنماط مرة واحدة قبل الحلقة وأعد استخدام فهارسها على تقارير بمئة ألف صف، هذا التغيير الواحد هو إحدى الروافع المغطاة في ضبط أداء المصنفات الكبيرة لـHotXLS حين تحتاج فقط إلى مظهر دلالي جاهز، تعرض كلتا الواجهتين ApplyBuiltinStyle على النطاقات، والتي تقابل أنماط Excel المدمجة Good وBad وNeutral وaccent دون أن تلمس التجمعات على الإطلاق
التنسيق الشرطي، والنص المنسّق، والأنماط المجمَّعة هي الميل الأخير من تقرير، تُطبَّق بعد استقرار نموذج البيانات والتخطيط، وتلك المراحل الأسبق موضوع توليد التقارير المستند إلى قوالب مع HotXLS المرجع الكامل للقواعد والتشغيلات والأنماط موجود على صفحة منتج HotXLS Delphi Component