مقاله فنی

بارگذاری MetadataOnly و انتخابی XLSX با HotXLS

HotXLS می‌تواند یک کاربرگ XLSX را باز کند و اصلاً هیچ سلول برگه‌ای را parse نکند. TXLSXWorkbook.MetadataOnly ویژگی‌های کاربرگ، نام‌های تعریف‌شده، نام و وضعیت دید برگه‌ها، سبک‌ها، تم، connectionها و پیوندهای خارجی را می‌خواند، سپس قبل از XML سلول متوقف می‌شود. برای یک پویشگر که باید بداند در یک دایرکتوری از کاربرگ‌ها چه هست، همان تفاوت میان دقیقه‌ها و ثانیه‌هاست

سه کلید مرتبط تصویر را کامل می‌کنند: SelectedSheets سلول‌ها را برای یک زیرمجموعه نام‌گذاری‌شده parse می‌کند، LoadSheet یک برگه رد‌شده را بعداً از آرشیو اصلی مادی می‌کند، و PreserveRawParts بایت‌های فشرده partهای تغییرنکرده را مستقیماً هنگام ذخیره کپی می‌کند. با هم استفاده شوند «باز کردن یک کاربرگ» را از یک عملیات همه‌یا‌هیچ به چیزی تبدیل می‌کنند که می‌توانید محدود کنید

بدون parse کردن یک سلول چه چیزی می‌آموزید؟

بیشتر از آنچه اکثر وظایف کشف نیاز دارند. با MetadataOnly تنظیم‌شده قبل از Open، کاربرگ با نام برگه‌ها و وضعیت دیدشان، نام‌های تعریف‌شده‌اش، ویژگی‌های سند، سبک‌ها و تم، پیوندهای خارجی و connectionهایش برمی‌گردد. برگه‌ها به‌عنوان اشیاء با صفر سلول موجود هستند

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

var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.MetadataOnly := True;      // set before Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] is 1-based
      if not Workbook.Sheets[I].Visible then
        Report.Add(FileName + ': hidden sheet ' +
          Workbook.Sheets[I].Name);
  finally
    Workbook.Free;
  end;
end;

بارگذاری دو برگه از چهل

SelectedSheets یک TStringList از نام برگه‌هاست. وقتی غیرخالی است، Open XML سلول را تنها برای برگه‌هایی که نام می‌برد parse می‌کند؛ هر برگه دیگر نام و وضعیت دید درست خود را نگه می‌دارد و هیچ سلولی حمل نمی‌کند. یک لیست خالی یعنی رفتار قبلی، که بارگذاری همه‌چیز است

تعامل با MetadataOnly ارزش بیان صریح دارد، چون برعکس گرفتنش یک کاربرگ خالی گیج‌کننده تولید می‌کند: MetadataOnly = True انتخاب را override می‌کند و همه برگه‌ها را رد می‌کند. از یکی یا دیگری استفاده کنید. کشف از metadata-only استفاده می‌کند؛ کار هدفمند از یک انتخاب استفاده می‌کند

Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
if Workbook.LoadSheet(ZeroBasedPosition) then
  Grid.Refresh;

LoadSheet(Index) یک برگه رد‌شده را هنگام درخواست از آرشیو اصلی مادی می‌کند، که همان چیزی است این الگو را در یک کاربرد تعاملی به‌جای تنها یک دسته قابل استفاده می‌کند. با برگه‌ای که کاربر به آن نگاه می‌کند باز کنید، بقیه را هنگام کلیک بارگذاری کنید. آرشیو دقیقاً به همین دلیل باز می‌ماند، پس کاربرگ را تا زمانی که کاربر ممکن است برگه دیگری بخواهد زنده نگه دارید

چرا یک رفت‌وبرگشت partهایی را که هرگز لمس نکرده‌اید تغییر می‌دهد؟

چون یک ذخیره ساده‌لوحانه همه‌چیز را بازتولید می‌کند. تم را decompress کنید، یک مدل شیء بسازید، آن را سریال کنید، recompress کنید — و اکنون بایت‌ها تفاوت دارند حتی اگر هیچ‌چیز درباره تم تغییر نکرده. برای پروژه‌های VBA و pivot cacheها که بدتر از اسراف‌کارانه است، چون آن partها ساختاری حمل می‌کنند که مدل شیء کاملاً نمایندگی نمی‌کند

PreserveRawParts با کپی کردن نمایش فشرده partهای تغییرنکرده مستقیماً از آرشیو منبع در طول SaveAs پاسخ می‌دهد. تم، پروژه VBA، pivot tableها و pivot cacheها وقتی اصلاح نشده‌اند به‌عنوان بایت منتقل می‌شوند. هیچ decompress، هیچ recompress، هیچ خطر گم‌کردن چیزی در یک رفت‌وبرگشت سریال‌سازی

هزینه یک محدودیتی است که از قبل داشتید: آرشیو منبع باید هنوز در زمان ذخیره در دسترس باشد. اگر workflow شما یک فایل را در حافظه می‌خواند، آن را می‌بندد و یک ساعت بعد ذخیره می‌کند، مسیر کپی raw چیزی برای کپی ندارد. منبع را برای طول عمر کاربرگ قابل‌دسترس نگه دارید، که همان الزام LoadSheet است

یک pipeline کشف که عمداً دوباره باز می‌کند

الگویی که در تولید کار می‌کند دو pass دارد و هیچ هوشمندی‌ای ندارد. pass یک metadata-only باز می‌کند و تصمیم می‌گیرد. pass دو فایل‌هایی که اهمیت دارند را با یک انتخاب برگه دوباره باز می‌کند و کار را انجام می‌دهد. باز کردن دوباره اتلاف‌کار به‌نظر می‌رسد تا وقتی می‌شمارید pass یک چه چیزی را اجتناب کرد: باز کردن دوم تنها یکی است که سلول‌ها را parse می‌کند، و تنها برگه‌هایی را parse می‌کند که pass یک انتخاب کرد

// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);

سعی نکنید یک کاربرگ metadata-only را در محل با پاک‌کردن flag بعد از Open ارتقا دهید. flag در طول باز شدن خوانده می‌شود؛ پاک‌کردنش بعداً درباره کاربرگی که XML سلولش هرگز بازدید نشده هیچ چیزی تغییر نمی‌دهد

این کجا با دیگر اهرم‌های فایل بزرگ جای می‌گیرد

بارگذاری انتخابی آنچه parse می‌کنید را کاهش می‌دهد. هزینه یک برگه را پس از بارگذاری کاهش نمی‌دهد، و وقتی واقعاً هر سلول هر برگه را نیاز دارید کمک نمی‌کند. برای آن مورد کار مرتبط روی جانب ذخیره‌سازی است، در یادداشت‌های ذخیره‌سازی سلول بلوک ردیفی و overlayهای سبک بازه‌ای توصیف شده، و روی جانب parse در parse موازی XLSX و تخصیص‌دهنده حافظه. وقتی کار یک پویش خالص بدون هیچ ویرایش است، خواننده مستقیم streaming از مدل شیء کاملاً عبور می‌کند و هر استراتژی بارگذاری که یکی می‌سازد را شکست می‌دهد

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