HotXLS สามารถเปิดเวิร์กบุ๊ก XLSX โดยไม่ parse เซลล์เวิร์กชีตเลยแม้แต่เซลล์เดียว TXLSXWorkbook.MetadataOnly อ่านคุณสมบัติเวิร์กบุ๊ก defined names ชื่อชีตและสถานะการมองเห็น สไตล์ ธีม การเชื่อมต่อ และ external link แล้วหยุดก่อนถึง cell XML สำหรับตัวสแกนที่ต้องรู้ว่ามีอะไรอยู่ในไดเรกทอรีของเวิร์กบุ๊ก นั่นคือความแตกต่างระหว่างนาทีกับวินาที
สวิตช์ที่เกี่ยวข้องอีกสามตัวทำให้ภาพครบถ้วน SelectedSheets parse เซลล์เฉพาะชุดย่อยที่ระบุชื่อ LoadSheet ทำให้ชีตที่ข้ามไปปรากฏเป็นรูปธรรมในภายหลังจากแฟ้มต้นฉบับ และ PreserveRawParts คัดลอกไบต์ที่บีบอัดของ part ที่ไม่เปลี่ยนแปลงผ่านตรงไปยังการบันทึก ใช้ร่วมกันแล้วพวกมันเปลี่ยน "เปิดเวิร์กบุ๊ก" จากการดำเนินการแบบ all-or-nothing เดียวให้เป็นสิ่งที่คุณกำหนดขอบเขตได้
คุณเรียนรู้อะไรได้โดยไม่ parse แม้แต่เซลล์เดียว
มากกว่าที่งานค้นพบส่วนใหญ่ต้องการ เมื่อตั้ง MetadataOnly ก่อน Open เวิร์กบุ๊กจะกลับมาพกชื่อชีตและสถานะการมองเห็น, defined names, คุณสมบัติเอกสาร, สไตล์และธีม, external link และการเชื่อมต่อ ชีตปรากฏเป็นออบเจกต์ที่มีเซลล์เป็นศูนย์
นั่นคือข้อมูลที่แคตตาล็อก การตรวจสอบ หรือการตัดสินใจกำหนดเส้นทางรันอยู่ เวิร์กบุ๊กใดบ้างที่กำหนดชื่อ 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 จะ parse cell 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) ทำให้ชีตที่ข้ามไปปรากฏเป็นรูปธรรมตามต้องการจากแฟ้มต้นฉบับ ซึ่งเป็นสิ่งที่ทำให้รูปแบบนี้ใช้งานได้ในแอปพลิเคชันโต้ตอบแทนที่เฉพาะชุดงาน เปิดด้วยชีตที่ผู้ใช้กำลังดู โหลดชีตอื่นเมื่อพวกเขาคลิก แฟ้มยังคงเปิดอยู่ด้วยเหตุผลนั้นพอดี ดังนั้นรักษาเวิร์กบุ๊กไว้ให้นานเท่าที่ผู้ใช้อาจขอชีตอื่น
ทำไมการเดินทางไปกลับจึงเปลี่ยน part ที่คุณไม่เคยแตะ
เพราะการบันทึกแบบไร้เดียงสาจะสร้างทุกอย่างใหม่ คลายบีบอัดธีม สร้าง object model ทำให้เป็นอนุกรมกลับ บีบอัดใหม่ — แล้วตอนนี้ไบต์ต่างออกไปทั้งที่ธีมไม่ได้เปลี่ยนแปลงอะไรเลย สำหรับโปรเจกต์ VBA และ pivot cache นั่นแย่กว่าการสิ้นเปลือง เพราะ part เหล่านั้นพกโครงสร้างที่ object model แทนไม่ครบ
PreserveRawParts ตอบสนองสิ่งนี้โดยคัดลอกการแทนแบบบีบอัดของ part ที่ไม่เปลี่ยนแปลงจากแฟ้มต้นฉบับโดยตรงระหว่าง SaveAs ธีม โปรเจกต์ VBA pivot table และ pivot cache เคลื่อนผ่านเป็นไบต์เมื่อมันไม่ได้ถูกแก้ไข ไม่มีการคลายบีบอัด ไม่มีการบีบอัดใหม่ ไม่มีความเสี่ยงที่จะสูญเสียบางสิ่งในการเดินทางไปกลับของการทำให้เป็นอนุกรม
ต้นทุนคือข้อจำกัดที่คุณมีอยู่แล้ว คือแฟ้มต้นฉบับต้องยังคงเข้าถึงได้ในเวลาบันทึก หากเวิร์กโฟลว์ของคุณอ่านไฟล์เข้าหน่วยความจำ ปิดมัน แล้วบันทึกอีกชั่วโมงถัดมา เส้นทางการคัดลอกแบบ raw ก็ไม่มีอะไรจะคัดลอก รักษาแหล่งให้เข้าถึงได้ตลอดอายุขัยของเวิร์กบุ๊ก ซึ่งเป็นข้อกำหนดเดียวกับที่ LoadSheet กำหนด
ไปป์ไลน์ค้นพบที่เปิดใหม่โดยตั้งใจ
รูปแบบที่ใช้งานได้ในการผลิตมีสองพาสโดยไม่มีเล่ห์เหลี่ยม พาสหนึ่งเปิดแบบเฉพาะเมตาดาต้าแล้วตัดสินใจ พาสสองเปิดไฟล์ที่สำคัญอีกครั้งด้วยการเลือกชีตแล้วทำงาน การเปิดใหม่ดูสิ้นเปลืองจนกว่าคุณจะนับสิ่งที่พาสหนึ่งหลีกเลี่ยง การเปิดครั้งที่สองเป็นครั้งเดียวที่ parse เซลล์ และมัน parse เฉพาะชีตที่พาสหนึ่งเลือก
// 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 สถานะนั้นถูกอ่านระหว่างการเปิด การล้างมันภายหลังไม่เปลี่ยนแปลงอะไรเกี่ยวกับเวิร์กบุ๊กที่ cell XML ของมันไม่เคยถูกเยี่ยมชมเลย
จุดที่สิ่งนี้สอดสนิทกับ lever อื่นของไฟล์ขนาดใหญ่
การโหลดแบบเลือกเฉพาะลดสิ่งที่คุณ parse มันไม่ได้ลดต้นทุนของชีตเมื่อโหลดแล้ว และไม่ช่วยเมื่อคุณต้องการเซลล์ทุกเซลล์ของทุกชีตจริง ๆ สำหรับกรณีนั้นงานที่เกี่ยวข้องอยู่ฝั่งพื้นที่จัดเก็บ ซึ่งอธิบายในบันทึกของ พื้นที่จัดเก็บเซลล์แบบ row-block และการซ้อนทับสไตล์ช่วง และฝั่งการ parse ใน การ parse XLSX แบบขนานและตัวจัดสรรหน่วยความจำ เมื่องานเป็นการสแกนล้วนโดยไม่มีการแก้ไขเลย ตัวอ่านตรงแบบสตรีมมิง จะข้าม object model ทั้งหมดและเอาชนะกลยุทธ์การโหลดใดก็ตามที่สร้าง model
HotXLS เปิดไฟล์ XLS และ XLSX จากโค้ด Delphi และ C++Builder พื้นเมืองโดยไม่มี dependency บน Excel งานค้นพบฝั่งเซิร์ฟเวอร์จึงรันโดยไม่ต้องติดตั้งอะไรนอกจาก executable ของคุณเอง — ดู หน้าคอมโพเนนต์สเปรดชีต HotXLS สำหรับรูปแบบและสิทธิ์การใช้งานที่รองรับ