يستطيع HotXLS فتح مصنّف XLSX دون تحليل أي خلية ورقة عمل إطلاقًا. يقرأ TXLSXWorkbook.MetadataOnly خصائص المصنّف والأسماء المعرفة وأسماء الأوراق وحالات الرؤية، والأنماط والسمة، والوصلات والروابط الخارجية، ثم يتوقف قبل XML للخلية. لماسح يحتاج معرفة ما في مجلد من المصنفات، هذا هو الفرق بين دقائق وثوانٍ
ثلاثة مفاتيح ذات صلة تُكمل الصورة: SelectedSheets يحلل خلايا لمجموعة مسماة، LoadSheet يجسّد ورقة متخطاة لاحقًا من الأرشيف الأصلي، وPreserveRawParts ينسخ البايتات المضغوطة للأجزاء غير المتغيرة مباشرة عند الحفظ. مستخدمة معًا تحوّل «فتح مصنّف» من عملية كل شيء أو لا شيء إلى شيء تستطيع تحديد نطاقه
ماذا تستطيع تعلمه دون تحليل خلية واحدة؟
أكثر مما تحتاجه أغلب مهام الاكتشاف. مع ضبط MetadataOnly قبل Open، يعود المصنّف حاملًا أسماء أوراقه وحالات رؤيتها، وأسماءه المعرفة، وخصائص مستنده، وأنماطه وسمته، وروابطه الخارجية ووصلاته. الأوراق موجودة ككائنات بصفر خلية
هذه بالضبط المعلومات التي يجري عليها فهرس أو تدقيق أو قرار توجيه. أيٌّ المصنفات يعرّف اسمًا يدعى 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 للخلايا للأوراق التي يسمّيها فقط؛ كل ورقة أخرى تحتفظ باسمها الصحيح وحالة رؤيتها ولا تحمل خلايا. قائمة فارغة تعني السلوك السابق، وهو تحميل كل شيء
التفاعل مع MetadataOnly يستحق البيان صراحةً، لأن عكسه يُنتج مصنّفًا فارغًا محيِّرًا: MetadataOnly = True يطغى على الاختيار ويتخطى كل الأوراق. استخدم واحدًا أو الآخر. الاكتشاف يستخدم البيانات الوصفية فقط؛ العمل الموجّه يستخدم اختيارًا
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) ورقة متخطاة عند الطلب من الأرشيف الأصلي، وهذا ما يجعل هذا النمط قابلًا للاستخدام في تطبيق تفاعلي بدلًا من دفعة فقط. افتح بالورقة التي ينظر إليها المستخدم، حمّل الأخرى حين ينقر. يبقى الأرشيف مفتوحًا لهذا السبب بالذات، فأبقِ المصنّف حيًّا ما دام المستخدم قد يطلب ورقة أخرى
لماذا تغيّر رحلة الذهاب والإياب أجزاءً لم تمسها؟
لأن الحفظ الساذج يعيد توليد كل شيء. فُك ضغط السمة، ابنِ نموذج كائن، أعد تسلسله، أعد الضغط — والآن تختلف البايتات مع أن شيئًا في السمة لم يتغير. لمشاريع VBA وذاكرات الجداول المحورية هذا أسوأ من مُضر، لأن تلك الأجزاء تحمل بنية لا يمثلها نموذج الكائن كاملًا
يجيب PreserveRawParts على هذا بنسخ التمثيل المضغوط للأجزاء غير المتغيرة مباشرة من الأرشيف المصدر أثناء SaveAs. السمة، ومشروع VBA، والجداول المحورية، وذاكرات الجداول المحورية تنتقل كبايتات حين لم تُعدَّل. لا فك ضغط، ولا إعادة ضغط، ولا خطر فقد شيء في رحلة ذهاب وإياب للتسلسل
التكلفة قيد كان لديك أصلًا: يجب أن يبقى الأرشيف المصدر متاحًا وقت الحفظ. إن كان سير عملك يقرأ ملفًا إلى الذاكرة، يغلقه، ويحفظ بعد ساعة، فليس لمسار النسخ الخام ما ينسخ منه. أبقِ المصدر قابلًا للوصول طوال حياة المصنّف، وهو المتطلب نفسه الذي يفرضه LoadSheet
خط أنابيب اكتشاف يعيد الفتح عمدًا
النمط الذي يعمل في الإنتاج له مساران وبلا براعة. المسار الأول يفتح بالبيانات الوصفية فقط ويقرر. المسار الثاني يعيد فتح الملفات المهمة باختيار ورقة ويعمل العمل. إعادة الفتح تبدو إسرافًا حتى تعدّ ما تجنّبه المسار الأول: الفتح الثاني هو الوحيد الذي يحلل الخلايا، ويحلل فقط الأوراق التي اختارها المسار الأول
// 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);
لا تحاول ترقية مصنّف بيانات وصفية فقط في موضعه بمسح العلم بعد Open. العلم يُقرَأ أثناء الفتح؛ مسحه بعده لا يغيّر شيئًا في مصنّف لم تُزرَ XML خلاياه أبدًا
أين يتناسب هذا مع روافع الملفات الكبيرة الأخرى
التحميل الانتقائي يقلّل ما تحلل. لا يقلّل ما تكلفه ورقة بمجرد تحميلها، ولا يساعد حين تحتاج فعلًا كل خلية في كل ورقة. لتلك الحالة العمل ذو صلة على جانب التخزين، موصوف في ملاحظات تخزين خلايا كتل الصفوف وتراكبات الأنماط الفاصلة، وعلى جانب التحليل في تحليل XLSX المتوازي وموزّع الذاكرة. حين تكون المهمة مسحًا خالصًا بلا تحرير إطلاقً، القارئ المباشر المتدفق يتخطى نموذج الكائن كليًا وسيتفوق على أي استراتيجية تحميل تبني واحدًا
يفتح HotXLS ملفات XLS وXLSX من كود Delphi وC++Builder أصلي بلا اعتماد على Excel، فيعمل وظيفة اكتشاف على جانب الخادم دون تثبيت شيء سوى ملفك التنفيذي — انظر صفحة مكوّن HotXLS لجداول البيانات للصيغ المدعومة والترخيص