يقوم HotXLS بإنشاء خطوط مؤشرات Excel (وهي المخططات المصغرة التي يرسمها Excel داخل خلية واحدة) من دلفي وC++Builder باستدعاء واحد: تبني TXLSXWorksheet.AddSparklineGroup مجموعة خطوط مؤشرات فوق نطاق بيانات، ويقوم حفظ مصنف العمل بكتابتها ككتلة امتداد x14 داخل extLst لورقة العمل، والتي يعرضها Excel 2010 والإصدارات الأحدث بينما يتخطاها القراء الأقدم دون شكوى. لا توجد كائنات مخططات، ولا أجزاء رسم، ولا مثبتات
السيناريو الذي يجعل خطوط المؤشرات تستحق الاقتناء هو نفسه دائماً. يحمل مصنف لوحة القيادة بضع مئات من الصفوف، صف لكل منتج أو منطقة أو حساب، واثني عشر رقماً شهرياً لكل منها، ويريد شخص ما جليف اتجاه (trend glyph) في نهاية كل صف. قم بنمذجة ذلك بمخططات حقيقية وستقوم بإنشاء مئات الأجزاء من مخططات DrawingML، كل منها بجزء XML خاص به، وعلاقته، وهندسة الإرساء الخاصة به، ناهيك عما يفعله ذلك بحجم الملف ووقت الفتح. ومجموعة خطوط المؤشرات هي كتلة XML واحدة تقول "ارسم خطاً صغيراً من B2:M2 إلى N2، ومن B3:M3 إلى N3"، مكررة بثمن بخس للعديد من الصفوف التي لديك
لماذا تعتبر خطوط المؤشرات امتداداً لـ x14 بدلاً من مخطط؟
وصلت خطوط المؤشرات مع برنامج Excel 2010، بعد ثلاث سنوات من تجميد مخطط ECMA-376 أساسي، لذا لم يكن بإمكانها العيش في ترميز ورقة العمل الصحيح دون كسر كل قارئ موجود. وجواب مايكروسوفت هو آلية قائمة الامتداد: قد تنتهي ورقة العمل بعنصر <extLst> يحتوي على كتل <ext>، كل منها معلم بـ URI يحدد الميزة (المواصفة [MS-XLSX] الفقرة 2.3.6). وتستخدم خطوط المؤشرات URI وهو {05C60535-1F16-4fd2-B633-F4F36F0B64E0} ومساحة الاسم x14. ويقوم القارئ الذي يتعرف على GUID بتحليل الكتلة؛ بينما يطلب من القارئ الذي لا يتعرف عليها تخطيها. وهذه هي قصة التوافقية المستقبلية بأكملها، وهي السبب في أن برنامج Excel 2007 يفتح مصنف خطوط المؤشرات بشكل نظيف — فهو ببساطة يعرض أرقام المصدر بدون الجليفات
هناك تفصيل واحد في الآلية يستحق الذكر لأنه يتعارض مع افتراض شائع: لا توجد حاجة إلى إعلان mc:Ignorable على جذر ورقة العمل. فبوابة ext GUID كافية بحد ذاتها، ويعلن كاتب Excel نفسه عن مساحة اسم x14 محلياً على عنصر <ext> بدلاً من لمس الجذر. ويتبع HotXLS النمط نفسه، مما يحافظ على بقية XML لورقة العمل دون تغيير. وهذا هو أيضاً الفرق الهيكلي عن المخططات الحقيقية: المخطط هو جزء منفصل من DrawingML مع خط أنابيب عرض خاص به، مغطى في المقالة المصاحبة عن المخططات والصور والرسومات، في حين أن خط المؤشر هو بيانات ورقة عمل وصفية ترسمها شبكة جدول البيانات نفسها
كيف تضيف خطوط المؤشرات إلى ملف XLSX برمجياً؟
تعتبر TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) مسار الاستدعاء الواحد: فهي تنشئ مجموعة من النوع المعطى، وتبذرها بلون السلسلة الافتراضي لـ Excel، وتضيف أول خط مؤشر يرسم نطاق مصدر مؤهل للورقة على خلية مضيفة. وتقبل TXLSXSparklineGroup المعادة بعد ذلك المزيد من خطوط المؤشرات من خلال طريقة Add الخاصة بها، زوج واحد F/Sqref لكل صف, وتتشارك جميعها نوع المجموعة وتنسيقها. وبالنسبة لحالة لوحة القيادة، هذا هو بالضبط الشكل الذي تريده: مجموعة واحدة، ومجموعة واحدة من الخيارات المرئية، ومئات الأعضاء
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Grp: TXLSXSparklineGroup;
Row: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('dashboard.xlsx');
Sheet := Book.Sheets[0];
// One group: every product row shares type and formatting
Grp := Sheet.AddSparklineGroup(xlsxSparklineLine,
'Sheet1!B2:M2', 'N2');
for Row := 3 to 201 do
Grp.Add(Format('Sheet1!B%d:M%d', [Row, Row]),
Format('N%d', [Row]));
Book.SaveAs('dashboard-trends.xlsx');
finally
Book.Free;
end;
end;
يغطي TXLSXSparklineType الأنواع الثلاثة التي يقدمها Excel: xlsxSparklineLine لخطوط الاتجاه، وxlsxSparklineColumn لمخططات الأعمدة الصغيرة، وxlsxSparklineStacked لشرائط الفوز/الخسارة حيث تعرض كل قيمة ككتلة لأعلى أو لأسفل. وكل خط مؤشر عضو هو مجرد سلسلتين نصيتين — F، نطاق المصدر المؤهل للورقة، وSqref، الخلية التي يرسم فيها الجليف — لذا لا يوجد شيء آخر لتكوينه لكل صف. ويمكن أيضاً بناء المجموعات يدوياً بالكامل من خلال مجموعة Worksheet.SparklineGroups عندما تريد البدء من مجموعة فارغة بدلاً من الافتراضية المبذورة
العلامات، وفتحات الألوان، وتقييس المحاور في النموذج المكتوب
تكشف TXLSXSparklineGroup عن مجموعة الخيارات الكاملة من شريط أدوات خطوط المؤشرات في Excel كخصائص عادية. وستة مفاتيح منطقية تؤكد على نقاط البيانات: Markers لكل نقطة على خط مؤشر، بالإضافة إلى HighPoint، وLowPoint، وNegativePoints، وFirstPoint، وLastPoint. وثمانية فتحات لألوان ARGB تقترن بها — ColorSeries، وColorNegative، وColorAxis، وColorMarkers، وColorFirst، وColorLast، وColorHigh، وColorLow — مع الاصطلاح بأن الفتحة المتروكة عند 0 يتم حذفها من الملف ويطبق Excel افتراضيه الخاص. ويظهر نفس شكل ARGB المعتم بالكامل عبر المكتبة، لذا فإن $FFD00000 هنا تعني نفس اللون الأحمر الذي تعنيه في أنماط التنسيق الشرطي
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // losing months stand out
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // one scale for all rows
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;
تستحق خصائص المحاور لحظة تفكير قبل قبول الافتراضيات. حيث تأخذ كل من MinAxisType وMaxAxisType تقييساً فردياً أو جماعياً أو مخصصاً: التقييس الفردي يمدد كل خط مؤشر إلى الحد الأدنى والأقصى الخاص به، مما يجعل الصف الذي يتذبذب بين 99 and 101 يبدو مثيراً مثل الصف الذي يتضاعف ثلاث مرات. ويضع تقييس المجموعة كل عضو على مقياس رأسي مشترك واحد، لذا فإن ارتفاع الجليف يعني نفس الكمية في كل صف — وهو عادة ما تريده لوحة القيادة المقارنة. وتقرر DisplayEmptyCellsAs ما تفعله خلية المصدر الفارغة بالخط: تترك فجوة، أو تحسب كصفر، أو تمتد عبر الفتحة بربط جيرانها
ما يكتبه HotXLS في extLst لورقة العمل عند الحفظ
عند الحفظ، يقوم HotXLS بمسلسلة كل مجموعة كعنصر x14:sparklineGroup يحمل سمات النوع والتبديل، وفتحات الألوان كعناصر فرعية، وقائمة x14:sparklines التي تقترن أعضاؤها بصيغة نطاق xm:f مع خلية مضيفة xm:sqref. ويقع الهيكل بأكمله داخل <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> في نهاية جزء ورقة العمل، مع إعلان مساحة اسم x14 مباشرة على الكتلة، تماماً كما يكتبها Excel. ولا تصدر ورقة العمل التي لا تحتوي على مجموعات خطوط مؤشرات أي extLst على الإطلاق، لذا فإن الملفات التي لم تستخدم الميزة أبداً تخرج متطابقة بايت ببايت مع ما أنتجته إصدارات HotXLS السابقة — نفس انضباط الكاتب المحافظ الموصوف في المقالة حول بنية الرحلة الدائرية غير المفقودة
هناك تفصيل مواصفة واحد يهم إذا قارنت المخرجات بـ Excel أو فحصت XML يدوياً: الافتراضي للمخطط لـ lineWeight هو 0.75 نقطة، وليس 1.25 الذي تقتبسه بعض المصادر الثانوية — تحدد المواصفة [MS-XLSX] CT_SparklineGroup@lineWeight بافتراضي 0.75، مطابقة للوزن الذي تطبقه واجهة مستخدم Excel بالفعل. ويحترم HotXLS الافتراضي عن طريق الحذف: اضبط LineWeight على أي شيء آخر غير 0.75 وتتم كتابة السمة، اتركها عند 0.75 ولا تكتب. وفهم هذا بشكل خاطئ في أي من الاتجاهين ينتج ملفات تعرض أثقل أو أخف قليلاً من نفس مصنف العمل المحفوظ من Excel
الرحلات الدائرية، ونسخ الأوراق، والامتدادات التي لا ينمذجها HotXLS
الفتح هو الصورة المرآتية للحفظ. عندما يفتح HotXLS مصنف عمل يحمل خطوط مؤشرات — سواء كتبه HotXLS أو Excel — فإن المحلل يبوب على GUID لـ sparkline ext ويعيد بناء كل خيارات المجموعة، والأعضاء، والألوان، والمحاور في النموذج المكتوب، بحيث تحافظ دورة فتح←تعديل←حفظ عليها تماماً. ويؤدي نسخ ورقة عمل إلى مصنف عمل آخر إلى استنساخ مجموعات خطوط المؤشرات الخاصة بها جنباً إلى جنب مع بقية الورقة، مما يجعل توليد التقارير المعتمدة على القوالب أمراً مباشراً: احتفظ بورقة قالب منسقة، وانسخها لكل تقرير، وأعد توجيه النطاقات
يمكن أن تحتوي extLst أيضاً على كتل امتداد ليس لدى HotXLS نموذج مكتوب لها — حيث يكتب Excel كتل x14 لميزات مثل مقسمات طرق العرض (slicers) والتنسيق الشرطي الممتد في القائمة نفسها. ومنذ الإصدار v2.131.0 يتم الاحتفاظ بتلك الكتل الأجنبية حرفياً عبر رحلة دائرية بدلاً من إسقاطها: حيث يلتقطها المحلل، ويعرضها للقراءة فقط من خلال Worksheet.RawWorksheetExts، ويكتبها مرة أخرى عند الحفظ، وتنتقل مع الورقة عندما يتم نسخها إلى مصنف عمل آخر. ويتم إعادة بناء XML المحفوظ من أحداث المحلل، لذا فهو مكافئ دلالياً للأصل وليس متطابقاً بالبايت، ولكن Excel يقبله وتنجو الميزات. والنتيجة العملية هي النتيجة المهمة في الإنتاج: فتح مصنف عمل العميل وإعادة حفظه لم يعد يجرده من الامتدادات التي لم تطلب من HotXLS فهمها
خط الحدود الصادق: تعرض خطوط المؤشرات في Excel 2010 والإصدارات الأحدث، وفي أي قارئ آخر يطبق امتداد x14؛ ويعرض Excel 2007 البيانات بدون الجليفات، وهو التدهور الذي صمم التنسيق ليكون عليه. وتغطي أنواع خطوط المؤشرات الثلاثة، وفتحات الألوان الثمانية، ومفاتيح النقاط، وأوضاع المحاور الثلاثة كامل سطح الخيارات الذي يقدمه مربع حوار Excel نفسه. ويُشحن دعم خطوط المؤشرات، جنباً إلى جنب مع بقية محرك XLSX الموضح هنا، في مكون HotXLS Delphi Excel Component لدلفي وC++Builder