ينشئ HotXLS كائنات كاميرا Excel على أوراق عمل XLSX من Delphi عبر AddCamera. وكائن الكاميرا صورة مرتبطة بشكل دائم بنطاق من الخلايا: يعيد Excel رسمها من نطاق المصدر في كل مرة يُفتح فيها المصنف أو يتغير المصدر، بحيث يمكن للوحة معلومات أن تُظهر عرضًا حيًّا لجدول موجود في ورقة أخرى، بأي حجم، ومُدارًا إن أردت
وتوجد هذه الميزة في Excel كأداة الكاميرا، وهي زر لم يره معظم المستخدمين لأنه ليس على الشريط افتراضيًا. وهي تحل مشكلة حقيقية في لوحات المعلومات أفضل من البدائل: فالنطاق المنسوخ يصبح قديمًا، ولا يمكن للمخطط أن يُظهر محتوى خلايا عشوائيًا، ولا يمكن لصورة مرتبطة لُصقت يدويًا أن يولّدها الكود. وكائن الكاميرا هو البنية الوحيدة التي تكون حية وعشوائية في آن واحد
أين تُوثَّق هذه الميزة، ولماذا يهم ذلك؟
لا تصف مواصفة جدول البيانات الرئيسية كائنات الكاميرا؛ إذ تُعامَل كتفصيل تنفيذي. ويعيش الوصف الموثوق في وثائق ترميز الرسم، تحت عنوان أداة الكاميرا، ومعرفة ذلك يوفر عليك بحثًا في المستند الخطأ يستغرق فترة بعد الظهر
وبنيويًا، كائن الكاميرا عنصر صورة عادي تحمل خصائصه غير المرئية قائمة امتدادات. ويُعرَّف الامتداد بمعرّف GUID ثابت، ويسجّل داخله عنصر من مساحة أسماء الرسم لعام 2010 شيئين: نطاق المصدر كمرجع مطلق بصيغة A1، مُؤهَّل اختياريًا بورقة، ومعرّف شكل. وكل شيء آخر في الصورة عادي
إنشاء واحدة
يوجد شكلان زائدان لأن طريقتين لتسمية نطاق مناسبتان. الشكل النصي يأخذ المرجع تمامًا كما سيُخزَّن، وهذا ما تريده لمصدر عبر الأوراق. أما شكل الإحداثيات فيأخذ أربعة إحداثيات خلايا على الورقة نفسها ويبني المرجع المطلق نيابة عنك:
uses
lxHandleX;
var
Book: TXLSXWorkbook;
Dashboard: TXLSXWorksheet;
Cam: TXLSXImage;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open('reporting.xlsx') <> 1 then
Exit;
Dashboard := Book.Sheets[0];
// عرض حي لـ Data!$B$2:$D$4، موضوع فوق B10:F20 على لوحة المعلومات
Cam := Dashboard.AddCamera('Data!$B$2:$D$4', 10, 2, 20, 6);
// مربع الوضع يستخدم افتراضيًا أعمدة Excel نفسها البالغة 64 بكسل
// وصفوف 20 بكسل؛ اضبط الحجم المرسوم بوحدة EMU لاحقًا إن لزم
Cam.WidthEMU := Round(12.5 * 914400 / 2.54); // 12.5 سم
Cam.HeightEMU := Round(6.0 * 914400 / 2.54);
Book.SaveAs('reporting-dashboard.xlsx');
finally
Book.Free;
end;
end;
والكائن المُعاد هو كائن صورة عادي بخاصية إضافية واحدة، CameraRange، وهي غير فارغة بالضبط عندما تكون الصورة كاميرا. وبهذه الطريقة أيضًا تكتشف الكاميرات في مصنف لم تُنشئه: عدّد الصور وتحقق من الخاصية
لماذا لا تحتاج الصورة النائبة إلى أن تكون حقيقية؟
تحتاج كل صورة في حزمة XLSX إلى جزء صورة، وكائن الكاميرا ليس استثناءً. لكن Excel يتجاهل تلك الصورة: فعند التحميل يعيد رسم النطاق المرتبط ويرسم النتيجة. وتوجد البايتات المضمّنة فقط كذاكرة تخزين مؤقتة للعرض للأدوات التي لا تنفّذ سلوك الكاميرا
وتزيل هذه الحقيقة نظامًا فرعيًا كاملاً من التنفيذ. فلا حاجة لترسيب نطاق المصدر، ولا حاجة لمحرك رسم لإنتاج اللقطة، ولا خطر من اختلاف الصورة المخزَّنة مؤقتًا عن الصورة الحية في Excel. يكتب HotXLS ملفًا وصفيًا نائبًا بالحد الأدنى — سجل ترويسة وسجل نهاية ملف، 108 بايت إجمالاً — مما يُبقي الحزمة مكتملة بنيويًا ولا يكلّف شيئًا
ونتيجة واحدة يجب التخطيط لها: أي عارض يرسم XLSX دون تنفيذ كائنات الكاميرا يُظهر الصورة النائبة، وهي فارغة. وإذا كانت مصنفاتك تُستهلَك بواسطة أداة كهذه، فكائن الكاميرا هو البنية الخاطئة والصورة المرسومة للنطاق هي الصحيحة
تحويل الوحدات الذي يسهل الخطأ فيه
تُقاس هندسة الرسم في Open XML بوحدات EMU المترية الإنجليزية، حيث تساوي البوصة الواحدة 914,400 وحدة EMU والسنتيمتر الواحد 360,000. أما ترويسات الملفات الوصفية فتسجّل إطارها بوحدات 0.01 مليمتر. والتحويل بينهما هو القسمة على 360
ويستحق هذا الأمر ذكرًا لأن الخطأ صامت. فالتحويل عبر البكسل بدقة 96 نقطة في البوصة بدلاً من ذلك — بالضرب في 2540 والقسمة على 9525 — ينتج قيمة أكبر بـ 96 مرة، ولا شيء يرفضها: فالحزمة صالحة، وتُوضع الصورة بشكل صحيح بواسطة المرساة، ولا يكون الهراء إلا في الإطار المُعلَن للملف الوصفي. ونموذج EMU وسلوك تقريبه موضحان في هندسة الصورة ووحدات EMU والتحجيم
الحفاظ على مصنف يحتوي كاميرات بالفعل عبر دورة كاملة
يحافظ فتح مصنف وحفظه على كائنات الكاميرا، بما في ذلك عنصر الامتداد ومرجع نطاقه. وهذا مهم أكثر من إنشائها: فمعظم المصنفات التي تحتوي كائنات كاميرا صُنعت في Excel بواسطة محلل، ومكتبة تُحوِّلها بصمت إلى صور عادية عند الحفظ تكون قد دمّرت السلوك الحي الذي اعتمد عليه المحلل
// تدقيق أي الصور كاميرات وأين تشير
for I := 0 to Sheet.Images.Count - 1 do
if Sheet.Images[I].CameraRange <> '' then
Writeln(Format('camera %d -> %s',
[I, Sheet.Images[I].CameraRange]));
وعندما تُنشئ لوحات معلومات برمجيًا، يكون التدقيق أيضًا اختبار الانحدار: فبعد دورة حفظ وإعادة فتح، يجب أن يشير العدد نفسه من الكاميرات إلى النطاقات نفسها. ومعالجة الصور والرسوم العامة، بما في ذلك نموذج التثبيت الذي يحدد مواضعها، موضحة في المخططات والصور والرسوم
متى تتفوق الكاميرا على البدائل
استخدم كائن كاميرا عندما يجب أن يظهر الجدول الحي نفسه في عدة أوراق بأحجام مختلفة، أو عندما يحتاج تخطيط طباعة إلى منطقة من ورقة واحدة مُركَّبة جنبًا إلى جنب مع مناطق من أوراق أخرى، أو عندما يجب أن تتبع كتلة ملخّصة تحريرات تمت في مكان آخر دون صيغة تربط كل خلية على حدة
فضّل الصيغ العادية عندما يكون الهدف حفنة من الخلايا، لأن صيغة عبر الأوراق أبسط ويفهمها كل أداة. وفضّل مخططًا عندما تكون البيانات فعليًا سلسلة لا كتلة منسَّقة. وفضّل صورة مرسومة عندما تُستهلَك المصنفات بأدوات غير Excel، أو عندما يجب ألا تتغير اللقطة بعد التسليم — فالتقرير المؤرشف يجب ألا يكون حيًّا
وملاحظة تخطيطية واحدة من الممارسة العملية: تُظهر الكاميرا نطاق المصدر منسَّقًا تمامًا كما هو، بما في ذلك الخلايا المدمجة، والتنسيقات الشرطية، وعروض الأعمدة. ولذلك تبدأ لوحة معلومات نظيفة المظهر بتنسيق نطاق المصدر كما لو كان هو المخرجات النهائية، وهو الانضباط نفسه الموصوف في الخلايا المدمجة وتخطيط قوالب التقارير
يأتي كائنات الكاميرا والرسوم وكاتب حزمة XLSX الذي يقف خلفها في مكتبة واحدة لـ Delphi و C++Builder؛ وتجد قائمة الميزات الكاملة على صفحة مكوّن HotXLS لجداول البيانات في Delphi