مقال تقني

تحرير رسوم Excel البيانية دون فقدان ChartML في HotXLS

يحافظ HotXLS على ChartML الأصلي لرسم بياناني مستورد من Excel ويعيد تشغيله بايتًا ببايت حين لم يتغير شيء في النموذج المُنمَّط، ففتح مصنّف وإعادة حفظه لا يجرد بهدوء أجزاء رسم بياني لا يمثلها نموذج الكائن. حرّر عنوانًا أو سلسلة أو محورًا ويدمج HotXLS بنيويًا العُقد المُنمَّطة الجديدة في الشجرة الأصلية بدلًا من إعادة توليد الرسم البياني من الصفر

ذلك التمييز — إعادة تشغيل حين لا يُمَس، ودمج حين يُحرَّر — هو ما يجعل تطبيق Delphi آمنًا لتوجيهه إلى رسوم بيانية بنى محلل في Excel. إعادة توليد رسم بياني من نموذج مُنمَّط تفقد دائمًا كل ما لا يعرفه النموذج، ورسوم Excel البيانية مليئة بأشياء لا يعرفها نموذج مكتبة: أنماط مخصصة، قوائم امتدادات، فروع محتوى بديل، تنسيق مؤهَّل بفضاء أسماء من إضافات

لماذا تُسطَّح رسوم بيانية عند إعادة حفظ المصنّف؟

لأن التنفيذ المعتاد يقرأ ما يفهمه ويكتب ما يفهمه. كل شيء بينهما — extLst من بناء Excel أحدث، فرع mc:AlternateContent، تأثير شكل ليس للنموذج خاصية له — موجود في الملف، لا موطن له في نموذج الكائن، ويختفي وقت الحفظ. يرى المستخدم رسمًا بيانيًا فقد تدرّجه، أو تسميات بياناته المخصصة، أو تأثيره ثلاثي الأبعاد، ولا يستطيع المصنّف تفسير السبب

مع تفعيل PreserveUnsupportedParts على المصنّف، يخزّن HotXLS بايتات ChartML الأصلية بترميز UTF-8 عند الاستيراد مع طول وبصمة 64 بت للمحتوى المُنمَّذج. إن لم يتغير النموذج المُنمَّط بحلول وقت الحفظ، يكتب البايتات الأصلية إلى الخلف. لا إعادة ترتيب XML، لا انجراف مسافات بيضاء، لا نسخة UTF-16 مقيمة من الرسم البياني معلَّقة في الذاكرة لرسم بياني لم يحرره أحد

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

ما الذي يحافظ عليه الدمج وما الذي يملكه النموذج

القاعدة هي الملكية. العُقد العامة للنموذج — العنوان، السلاسل، الذاكرات، مجموعات الرسم، المحاور — يقررها الشجرة المُولَّدة حديثًا. الأشجار الفرعية غير المُنمَّذجة تُنقَل من الأصل. تلك اللامتناظرية متعمَّدة، وهي الجزء الذي يحتاج لحظة لاستيعابه: حذف سلسلة يجب ألا يُحيي السلسلة القديمة من XML المحفوظ، فأي شيء يملكه النموذج يُؤخَذ من النموذج حتى حين يقول النموذج «اختفى»

المحتوى غير المملوك يُعاد إدراجه بجوار العُقد المطابقة التي جلس بجوارها، وتبقى extLst أخيرة داخل أصلها لأن هذا ما يفرضه المخطط. مسح خاصية معروفة — إزالة علم غامق، إسقاط لون — يُعامَل كمسح، لا كفجوة تُملأ من الشجرة الأصلية. السمات غير المعروفة في الحي نفسه تحتفظ بمكانها

محتوى توافق الوسم يحصل على معالجة محددة. عند التحليل، يتخطى HotXLS mc:Choice ويقرأ mc:Fallback؛ إن كان فرع التراجع ذلك يلفّ مجموعة رسم يعرفها النموذج، يكتب الدمج المحتوى المُنمَّط الجديد إلى داخل الشجرة الفرعية للتراجع. دون تلك الخطوة سيُصدِر الحفظ مجموعة الرسم الجديدة ويترك القديمة داخل التراجع، فيحمل الرسم البياني اثنتين

إخراج رسم بياني واحد من الحفظ

ClearPreservedXml يُسقط XML الأصلي والبصمة لرسم بياني واحد، فيعيد البناء التالي ذلك الرسم البياني بحتًا من النموذج المُنمَّط. هو قرار لكل رسم بياني؛ PreserveUnsupportedParts على مستوى المصنّف لا يزال يحكم إن كانت حالة الحفظ تُبنى عند الاستيراد

مدّ يدك له حين تريد رسمًا بيانيًا نظيفًا لا أمينًا — مثلًا حين يحمل رسم قالب تنسيقًا من سمة شركة قديمة وغرض العملية التخلص منه. لا تمدّده كرد فع لتنقيح: رسم بياني يعرض خطأ بعد التحرير هو أغلب سؤال نمذجة لا سؤال حفظ، ومسح XML المحفوظ يُتلف الدليل

الرسوم البيانية المركبة والمحور الثاني

يبني AddPlotGroup رسومًا بيانية مركبة مرتَّبة، حيث تحتفظ كل مجموعة رسم بعائلة رسمها البياني الخاصة وبإسناد محورها الأساسي أو الثانوي. هذا ما يحتاجه الرسم البياني التجاري المنتشر: الإيرادات أعمدة على المحور الأيسر، وهامش النسبة المئوية خط على اليمين

تكشف الرسوم البيانية محاور الفئات والقيم الأساسية والثانوية زائد محور سلاسل، مع إعدادات الفئة والقيمة والتاريخ ومحور السلاسل المُنمَّطة التي تغطي المواضع، والمعرّفات، والتقاطعات، ووحدات التاريخ، وفواصل التسمية، والرؤية. واجهة المسطحة الأقدم — ChartType وAddSeries، مجموعة Series المسطحة — لا تزال تعالج مجموعة الرسم الأساسية، فيستمر الكود القائم في العمل بينما يحمل النموذج تحته كل مجموعة مرتَّبة

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

قبل وجود هذا النموذج، فتح وإعادة حفظ رسم بياني مركب كان يطواه إلى عائلة رسم بياني واحدة ويفقد المحاور الثانوية والتاريخ والسلاسل. مراجع صيغة الرسم البياني وقيم السلاسل المخزَّنة الآن تنجو من نسخ المصنّف ودورات الفتح/الحفظ أيضًا، وتُطابَق مراسي الرسم البياني بأجزاء الرسم عبر معرّف العلاقة — فتطبيق يعيد ترتيب مدخلات العلاقة لم يعد يبدل محتويات الرسم البياني بين مواضع ورقة العمل

فخ التخطيط اليدوي

إن وضعت منطقة رسم أو عنوان أو عنوان محور أو وسيلة إيضاح يدويًا، اكتب الإحداثيات الأربعة جميعها. يتطلب Office x وy وw وh كمجموعة كاملة كلما وُجد أيٌّ منها، ويتجاهل manualLayout كاملًا وإلا. يُصدِر HotXLS المستطيل الكامل دائمًا لهذا السبب، وSetPositionAndSize يضبطه ويفعّله في استدعاء واحد

تفصيلان آخران يتبعان Excel لا مرونة المواصفات الكاملة. الموضع يُكتَب بضبط xMode وyMode على edge بينما الحجم يستخدم factor لـ wMode وhMode، لأن هذا ما يكتبه Excel وما يحول إليه التراكيب الأخرى. وlayoutTarget يُصدَر فقط لمنطقة الرسم، أبدًا للعناوين أو وسائل الإيضاح، حيث تمنع ملاحظات تنفيذ Microsoft ذلك

ملاءمة هذا في رحلة ذهاب وإياب للمصنّف

حفظ الرسم البياني حالة واحدة من سياسة عامة: مكتبة تحرر مستندات أُلِّفت في مكان آخر ينبغي أن تغيّر ما طُلب تغييره ولا شيء غيره. يستند المنطق نفسه إلى HotXLS على السمات وسلاسل الحساب وامتدادات أوراق العمل، موصوف في ملاحظات رحلات الذهاب والإياب غير الفاقدة للسمة وextLst وcalcChain، وعلى مشاريع VBA والروابط الخارجية في حفظ VBA والروابط الخارجية. لسطح تأليف الرسم البياني نفسه — إنشاء الرسوم البيانية، ووضع الصور والرسومات من Delphi — انظر شرح الرسوم البيانية والصور والرسومات في HotXLS

يقرأ HotXLS ويحرر ويكتب رسوم XLSX البيانية من كود Delphi وC++Builder أصلي دون تثبيت Excel على الآلة، وهذا ما يجعل الأمانة مشكلة مكتبة لا مشكلة أتمتة — صفحة مكوّن HotXLS لجداول البيانات فيها قائمة ميزات الرسم البيائي وتنزيل تجريبي