مقاله فنی

اشیاء دوربین اکسل از دلفی: نماهای زنده

HotXLS از طریق AddCamera اشیاء دوربین اکسل را روی کاربرگ‌های XLSX از دلفی ایجاد می‌کند. یک شیء دوربین یک تصویر است که به‌طور دائمی به یک محدوده سلول‌ها متصل است: اکسل آن را از محدوده منبع هر بار که کتاب‌کار باز می‌شود یا منبع تغییر می‌کند دوباره رندر می‌کند، بنابراین یک داشبورد می‌تواند یک نمای زنده از جدولی که روی کاربرگ دیگری قرار دارد نشان دهد، در هر اندازه‌ای، اگر بخواهید چرخانده‌شده

این ویژگی در اکسل به‌عنوان ابزار دوربین وجود دارد، دکمه‌ای که بیشتر کاربران هرگز آن را ندیده‌اند زیرا به‌طور پیش‌فرض روی نوار ابزار نیست. آن یک مسئله واقعی داشبورد را بهتر از جایگزین‌ها حل می‌کند: یک محدوده کپی‌شده کهنه می‌شود، یک نمودار نمی‌تواند محتوای سلولی دلخواه را نشان دهد، و یک تصویر پیوندی که با دست چسبانده شده نمی‌تواند توسط کد تولید شود. یک شیء دوربین تنها ساختاری است که هم زنده و هم دلخواه است

شیء دوربین ساخته‌شده توسط HotXLS از دلفی: تصویری زنده از Data!$B$2:$D$4 که روی یک کاربرگ داشبورد قرار گرفته و اکسل آن را هنگام بازکردن و در هر ویرایش منبع دوباره رندر می‌کند
یک شیء دوربین به‌طور دائمی به محدوده منبعش متصل می‌ماند، بنابراین اکسل تصویر را هنگام بازکردن و در هر ویرایش دوباره رندر می‌کند، در هر اندازه‌ای و از محدوده‌ای روی کاربرگ دیگر

این کجا مستند شده، و چرا اهمیت دارد؟

مشخصه اصلی صفحه‌گسترده اشیاء دوربین را توصیف نمی‌کند؛ آن‌ها به‌عنوان یک جزئیات پیاده‌سازی رفتار می‌شوند. توصیف معتبر در مستندات نشانه‌گذاری ترسیم زندگی می‌کند، زیر عنوان ابزار دوربین، و دانستن این یک بعدازظهر جستجو در سند اشتباه را صرفه‌جویی می‌کند

از نظر ساختاری، یک شیء دوربین یک عنصر تصویر معمولی است که ویژگی‌های غیربصری تصویرش یک لیست بسط حمل می‌کند. آن بسط با یک GUID ثابت شناسایی می‌شود، و درون آن یک عنصر از فضای‌نام ترسیم ۲۰۱۰ دو چیز را ثبت می‌کند: محدوده منبع به‌صورت یک ارجاع مطلق سبک-A1، به‌طور اختیاری واجد شرط با کاربرگ، و یک شناسه شکل. هرچیز دیگری درباره تصویر عادی است

کالبدشناسی XLSX یک شیء دوربین که توسط HotXLS از دلفی نوشته شده: یک عنصر تصویر معمولی که لیست بسط آن یک عنصر از فضای‌نام ترسیم ۲۰۱۰ حمل می‌کند و محدوده منبع مطلق و یک شناسه شکل را ثبت می‌کند
از نظر ساختاری یک دوربین یک تصویر معمولی به‌علاوه یک عنصر بسط از فضای‌نام ترسیم ۲۰۱۰ است، که محدوده منبع مطلق به سبک 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);

    // جعبه قرارگیری به‌طور پیش‌فرض ستون‌های ۶۴ پیکسلی و سطرهای ۲۰ پیکسلی
    // خود اکسل است؛ اندازه رسم‌شده را بعداً در EMU در صورت نیاز تنظیم کنید
    Cam.WidthEMU := Round(12.5 * 914400 / 2.54);   // ۱۲٫۵ سانتی‌متر
    Cam.HeightEMU := Round(6.0 * 914400 / 2.54);

    Book.SaveAs('reporting-dashboard.xlsx');
  finally
    Book.Free;
  end;
end;

شیء برگردانده‌شده یک شیء تصویر معمولی با یک ویژگی اضافه است، CameraRange، که دقیقاً وقتی تصویر یک دوربین باشد غیرخالی است. این هم همان شیوه‌ای است که دوربین‌ها را در کتاب‌کاری که خودتان نساخته‌اید تشخیص می‌دهید: تصاویر را شمارش کنید و ویژگی را بررسی کنید

چرا تصویر جانگهدار نیازی به واقعی بودن ندارد؟

هر تصویر در یک بسته XLSX به یک بخش تصویر نیاز دارد، و یک شیء دوربین استثنا نیست. اما اکسل آن تصویر را نادیده می‌گیرد: هنگام بارگذاری محدوده پیوندی را دوباره رندر می‌کند و نتیجه را نقاشی می‌کند. بایت‌های جاسازی‌شده صرفاً به‌عنوان یک کش نمایش برای ابزارهایی وجود دارند که رفتار دوربین را پیاده‌سازی نمی‌کنند

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

یک پیامد برای برنامه‌ریزی: یک نمایشگری که XLSX را بدون پیاده‌سازی اشیاء دوربین رندر می‌کند، جانگهدار را نشان می‌دهد، که خالی است. اگر کتاب‌کارهای شما توسط چنین ابزاری مصرف می‌شوند، یک شیء دوربین ساختار اشتباه است و یک تصویر رندرشده از محدوده ساختار درست است

بخش تصویر جانگهدار یک شیء دوربین HotXLS: اکسل محدوده پیوندی را هنگام بارگذاری دوباره رندر می‌کند و متافایل ۱۰۸ بایتی را نادیده می‌گیرد، در حالی که نمایشگرهای بدون پشتیبانی دوربین یک تصویر خالی نشان می‌دهند
اکسل بایت‌های جاسازی‌شده را نادیده می‌گیرد و محدوده پیوندی را هنگام بارگذاری دوباره رندر می‌کند، بنابراین HotXLS فقط یک متافایل جانگهدار ۱۰۸ بایتی می‌نویسد، در حالی که نمایشگری بدون پشتیبانی دوربین جانگهدار خالی را نشان می‌دهد

تبدیل واحدی که اشتباه کردنش آسان است

هندسه ترسیم در Open XML به واحدهای متریک انگلیسی اندازه‌گیری می‌شود، جایی که یک اینچ ۹۱۴٬۴۰۰ EMU و یک سانتی‌متر ۳۶۰٬۰۰۰ است. با این حال، سربرگ‌های متافایل قاب خود را به واحدهای ۰٫۰۱ میلی‌متر ثبت می‌کنند. تبدیل میان آن‌ها یک تقسیم بر ۳۶۰ است

ارزش نام بردن از این را دارد زیرا اشتباه بی‌صدا است. تبدیل از طریق پیکسل با ۹۶ DPI به‌جای آن — ضرب در ۲۵۴۰ و تقسیم بر ۹۵۲۵ — مقداری ۹۶ برابر بیش‌ازحد بزرگ تولید می‌کند، و هیچ چیز آن را رد نمی‌کند: بسته معتبر است، تصویر به‌درستی توسط anchor قرار می‌گیرد، و فقط قاب اعلام‌شده متافایل بی‌معناست. مدل EMU و رفتار گردکردنش در هندسه تصویر، واحدهای EMU و مقیاس‌بندی پوشش داده شده است

رفت‌وبرگشت یک کتاب‌کاری که از قبل دوربین دارد

باز و ذخیره کردن یک کتاب‌کار اشیاء دوربین را حفظ می‌کند، شامل عنصر بسط و ارجاع محدوده‌اش. این بیشتر از ایجاد آن‌ها اهمیت دارد: بیشتر کتاب‌کارهای دارای اشیاء دوربین توسط یک تحلیل‌گر در اکسل ساخته شده‌اند، و کتابخانه‌ای که بی‌سروصدا آن‌ها را هنگام ذخیره به تصاویر معمولی تبدیل می‌کند، رفتار زنده‌ای را که تحلیل‌گر به آن متکی بود از بین برده است

// حسابرسی این‌که کدام تصاویر دوربین‌اند و به کجا اشاره می‌کنند
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]));

وقتی داشبوردها را به‌صورت برنامه‌نویسی‌شده تولید می‌کنید، حسابرسی هم آزمون رگرسیون است: پس از یک چرخه ذخیره-و-بازگشایی، همان تعداد دوربین باید به همان محدوده‌ها اشاره کند. مدیریت عمومی تصویر و ترسیم، شامل مدل انکرینگی که آن‌ها را جای‌گذاری می‌کند، در نمودارها، تصاویر و ترسیم‌ها پوشش داده شده است

چه زمانی یک دوربین بر جایگزین‌ها برتری دارد

وقتی همان جدول زنده باید روی چند کاربرگ در اندازه‌های مختلف ظاهر شود، وقتی یک چیدمان چاپی به ناحیه‌ای از یک کاربرگ نیاز دارد که کنار نواحی دیگر ترکیب شده، یا وقتی یک بلوک خلاصه باید ویرایش‌های انجام‌شده در جای دیگر را بدون یک فرمول که تک‌تک هر سلول را پیوند می‌دهد دنبال کند، از یک شیء دوربین استفاده کنید

وقتی هدف تعداد کمی سلول است، فرمول‌های معمولی را ترجیح دهید، زیرا یک فرمول میان‌کاربرگی ساده‌تر است و هر ابزاری آن را می‌فهمد. وقتی داده واقعاً یک سری است نه یک بلوک قالب‌بندی‌شده، یک نمودار را ترجیح دهید. و وقتی کتاب‌کار توسط ابزارهایی غیر از اکسل مصرف می‌شود، یا وقتی نما پس از تحویل نباید تغییر کند — یک گزارش بایگانی‌شده نباید زنده باشد — یک تصویر رندرشده را ترجیح دهید

یک یادداشت چیدمانی از عمل: یک دوربین محدوده منبع را دقیقاً همان‌طور که قالب‌بندی شده نشان می‌دهد، شامل سلول‌های ادغام‌شده، قالب‌بندی‌های شرطی و عرض ستون‌ها. بنابراین ساختن یک بلوک داشبورد تمیز از قالب‌بندی محدوده منبع به‌گونه‌ای شروع می‌شود که انگار خروجی نهایی است، که همان انضباطی است که در سلول‌های ادغام‌شده و چیدمان الگوی گزارش شرح داده شده

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