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 ומטמוני pivot זה גרוע מבזבזני, מפני שחלקים אלה נושאים מבנה שמודל האובייקט אינו מייצג במלואו
PreserveRawParts עונה על כך על ידי העתקת הייצוג הדחוס של חלקים שלא השתנו ישירות מתוך ארכיון המקור במהלך SaveAs. ערכת נושא, פרויקט VBA, טבלאות pivot ומטמוני pivot עוברים כבייטים כשלא שונו. ללא פריקת דחיסה, ללא דחיסה מחדש, ללא סיכון של איבוד משהו במעבר סריאליזציה
העלות היא אילוץ שכבר היה לך: ארכיון המקור חייב להיות עדיין זמין בזמן השמירה. אם זרימת העבודה שלך קוראת קובץ לזיכרון, סוגרת אותו ושומרת שעה אחר כך, לנתיב ההעתקה הגולמי אין ממה להעתיק. החזק את המקור בר-השגה לאורך חיי חוברת העבודה, שזוהי אותה דרישה ש-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 של התאים שלה מעולם לא ביקר
היכן זה משתלב עם שאר המנופים לקבצים גדולים
טעינה סלקטיבית מפחיתה את מה שאתה מנתח. היא אינה מפחיתה את מה שגיליון עולה לאחר טעינתו, ואינה עוזרת כשאתה זקוק באמת לכל תא של כל גיליון. למקרה זה העבודה הרלוונטית היא בצד האחסון, המתוארת בהערות על אחסון תאים בבלוקי-שורות ושכבות סגנון מסוג interval, ובצד הניתוח בניתוח XLSX מקבילי ומקצה הזיכרון. כשהמשימה היא סריקה טהורה ללא עריכה כלל, הקורא הישיר הזורם מדלג על מודל האובייקט לחלוטין וינצח כל אסטרטגיית טעינה שבונה אחד
HotXLS פותח קבצי XLS ו-XLSX מקוד דלפי ו-C++Builder מקורי ללא תלות ב-Excel, כך שעבודת גילוי בצד-שרת רצה ללא שום דבר מותקן מעבר לקובץ ההפעלה שלך — ראה את דף רכיב הגיליון האלקטרוני HotXLS לפורמטים הנתמכים והרישוי