مقاله فنی

ویرایش نمودارهای Excel بدون از دست دادن ChartML در HotXLS

HotXLS ChartML اصلی یک نمودار Excel وارد‌شده را نگه می‌دارد و وقتی هیچ‌چیز در مدل تایپ‌شده تغییر نکرده آن را بایت به بایت پخش می‌کند، تا باز کردن و ذخیره مجدد یک کاربرگ به‌طور خاموش partهای یک نمودار را که مدل شیء نمایندگی نمی‌کند حذف نکند. یک عنوان، یک سری یا یک محور را ویرایش کنید و HotXLS گره‌های تایپ‌شده جدید را ساختاری در درخت اصلی ادغام می‌کند به‌جای تولید دوباره نمودار از صفر

آن تمایز — پخش وقتی دست‌نخورده، ادغام وقتی ویرایش‌شده — همان چیزی است که یک کاربرد Delphi را امن می‌کند تا به نمودارهایی اشاره کند که یک تحلیل‌گر در Excel ساخته. تولید دوباره یک نمودار از یک مدل تایپ‌شده همیشه هر چیزی را که مدل نمی‌داند از دست می‌دهد، و نمودارهای Excel از چیزهایی پر هستند که یک کتابخانه نمی‌داند: سبک‌های سفارشی، لیست‌های پسوند، شاخه‌های محتوای جایگزین، قالب‌بندی دارای فضای‌نام از add-onها

چرا ذخیره مجدد یک کاربرگ نمودارهایش را تخت می‌کند؟

چون پیاده‌سازی معمول آنچه می‌فهمد را می‌خواند و آنچه می‌فهمد را می‌نویسد. هر چیزی در میان — یک extLst از یک build جدیدتر Excel، یک شاخه mc:AlternateContent، یک افکت شکل که مدل هیچ ویژگی‌ای برایش ندارد — در فایل وجود دارد، در مدل شیء خانه‌ای ندارد، و در زمان ذخیره ناپدید می‌شود. کاربر نموداری را می‌بیند که گرادیان، برچسب‌های داده سفارشی یا افکت 3D خود را از دست داده، و کاربرگ نمی‌تواند توضیح دهد چرا

با PreserveUnsupportedParts روی کاربرگ روشن، HotXLS بایت‌های UTF-8 نمودار اصلی را هنگام import به‌اضافه یک طول و یک اثرانگشت 64بیتی از محتوای مدل‌شده ذخیره می‌کند. اگر مدل تایپ‌شده تا زمان ذخیره تغییر نکرده باشد، بایت‌های اصلی را بازنویس می‌کند. بدون بازترتیب XML، بدون انحراف whitespace، بدون کپی 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;

ادغام چه چیزی را نگه می‌دارد و مدل چه چیزی را مالک است

قانون مالکیت است. گره‌های مدل عمومی — عنوان، سری‌ها، cacheها، گروه‌های plot، محورها — توسط درخت تازه‌تولید‌شده تصمیم داده می‌شوند. زیردرختان مدل‌نشده از اصلی حمل می‌شوند. آن عدم‌تقارن عمدی است، و بخشی است که لحظه‌ای برای درونی‌کردن طول می‌کشد: حذف یک سری نباید سری قدیمی را از XML حفظ‌شده زنده کند، پس هر چیزی که مدل مالک است از مدل گرفته می‌شود حتی وقتی مدل می‌گوید «رفته»

محتوای بدون مالک در کنار گره‌های منطبق‌شده‌ای که کنارشان نشسته بود دوباره درج می‌شود، و extLst درون والد خود آخر می‌ماند چون شمای آن را الزام می‌کند. پاک‌کردن یک ویژگی شناخته‌شده — حذف یک flag bold، حذف یک رنگ — به‌عنوان یک پاک‌کردن رفتار می‌شود، نه به‌عنوان یک شکاف که از درخت اصلی پر شود. ویژگی‌های ناشناخته در همان همسایگی جای خود را نگه می‌دارند

محتوای markup-compatibility مدیریت خاص می‌گیرد. هنگام parse، HotXLS mc:Choice را رد می‌کند و mc:Fallback را می‌خواند؛ اگر آن شاخه fallback یک گروه plot را بپیچد که مدل می‌شناسد، ادغام محتوای تایپ‌شده جدید را درون زیردرخت fallback بازنویسی می‌کند. بدون آن مرحله یک ذخیره گروه plot جدید را emit می‌کرد و قدیمی را درون fallback می‌گذاشت، و نمودار دو تا حمل می‌کرد

خارج کردن یک نمودار

ClearPreservedXml XML اصلی و اثرانگشت یک نمودار را رها می‌کند، تا ذخیره بعدی آن نمودار را صرفاً از مدل تایپ‌شده بازسازی کند. این یک تصمیم per-chart است؛ PreserveUnsupportedParts سطح کاربرگ هنوز حاکم است که آیا وضعیت preservation هنگام import ساخته می‌شود

وقتی به آن دست می‌برید که یک نمودار تمیز می‌خواهید نه وفادار — مثلاً وقتی یک نمودار قالب قالب‌بندی از یک تم شرکتی قدیمی حمل می‌کند و نقطه عملیات دورریختن آن است. به‌عنوان یک رفلکس debug به آن دست نبرید: نموداری که پس از یک ویرایش اشتباه رندر می‌شود اغلب یک سؤال مدل‌سازی است نه یک سؤال preservation، و پاک‌کردن XML حفظ‌شده شواهد را نابود می‌کند

نمودارهای ترکیبی و محور دوم

AddPlotGroup نمودارهای ترکیبی مرتب می‌سازد، که در آن هر گروه plot خانواده نمودار خود و انتساب محور اصلی یا ثانویه خود را نگه می‌دارد. این همان چیزی است نمودار تجاری همه‌جا حاضر نیاز دارد: درآمد به‌عنوان ستون روی محور چپ، درصد حاشیه به‌عنوان خط روی محور راست

نمودارها محورهای دسته و مقدار اصلی و ثانویه به‌اضافه یک محور سری عرضه می‌کنند، با تنظیمات تایپ‌شده دسته، مقدار، تاریخ و محور سری که موقعیت‌ها، شناسه‌ها، تقاطع‌ها، واحدهای تاریخ، بازه‌های برچسب و دید را پوشش می‌دهند. API تخت قدیمی‌تر — ChartType، AddSeries، مجموعه تخت Series — هنوز گروه plot اصلی را آدرس‌دهی می‌کند، پس کد موجود به کارش ادامه می‌دهد در حالی که مدل زیرین هر گروه مرتب را نگه می‌دارد

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;

قبل از وجود این مدل، باز کردن و ذخیره مجدد یک نمودار ترکیبی آن را به یک خانواده نمودار تخت می‌کرد و محورهای ثانویه، تاریخ و سری را از دست می‌داد. ارجاع‌های فرمول نمودار و مقادیر سری cache‌شده اکنون کپی‌های کاربرگ و چرخه‌های باز/ذخیره را نیز پشت سر می‌گذارند، و لنگرهای نمودار بر اساس شناسه رابطه به partهای نمودارشان منطبق می‌شوند — پس کاربردی که entryهای رابطه را مرتب می‌کند دیگر محتوای نمودار را میان موقعیت‌های کاربرگ جابجا نمی‌کند

تله چیدمان دستی

اگر یک plot area، عنوان، عنوان محور یا legend را به‌صورت دستی موقعیت‌دهی می‌کنید، هر چهار مختصات را بنویسید. Office هر زمان هر یک از x، y، w و h موجود باشد آن‌ها را به‌عنوان یک گروه کامل الزام می‌کند، و در غیر این صورت کل manualLayout را نادیده می‌گیرد. HotXLS به همین دلیل همیشه مستطیل کامل را emit می‌کند، و SetPositionAndSize آن را در یک فراخوانی تنظیم و فعال می‌کند

دو جزئیات دیگر به‌جای آزادی کامل مشخصات از Excel پیروی می‌کنند. موقعیت با xMode و yMode تنظیم‌شده به edge نوشته می‌شود در حالی که اندازه از factor برای wMode و hMode استفاده می‌کند، چون همان چیزی است Excel می‌نویسد و دیگر ترکیب‌ها را به آن تبدیل می‌کند. و layoutTarget تنها برای plot area emit می‌شود، هرگز برای عنوان‌ها یا legendها، جایی که یادداشت‌های پیاده‌سازی Microsoft آن را ممنوع می‌کنند

جا دادن این در یک رفت‌وبرگشت کاربرگ

preservation نمودار یک نمونه از یک خط‌مشی کلی است: یک کتابخانه که اسناد تألیف‌شده جای‌دیگری را ویرایش می‌کند باید آنچه از آن خواسته شده را تغییر دهد و هیچ‌چیز دیگر. همان استدلال HotXLS را روی تم‌ها، زنجیره‌های محاسبه و پسوندهای کاربرگ هدایت می‌کند، در یادداشت‌های رفت‌وبرگشت بدون‌خطا برای تم، extLst و calcChain توصیف شده، و روی پروژه‌های VBA و پیوندهای خارجی در حفظ VBA و پیوندهای خارجی. برای سطح تألیف نمودار خودش — ایجاد نمودارها، قرار دادن تصاویر و نقاشی‌ها از Delphi — مرور نمودارها، تصاویر و نقاشی‌ها در HotXLS را ببینید

HotXLS نمودارهای XLSX را از کد بومی Delphi و C++Builder می‌خواند، ویرایش و می‌نویسد بدون هیچ نصب Excel روی ماشین، که همان چیزی است وفاداری را به یک مسئله کتابخانه‌ای به‌جای یک مسئله اتوماسیون تبدیل می‌کند — صفحه جزء spreadsheet برای HotXLS لیست ویژگی نمودار و یک دانلود آزمایشی دارد