Technical Article

การดึงข้อมูลสรุปเอกสารจากไฟล์ Excel ใน Delphi

เมื่อประมวลผลแบตช์ขนาดใหญ่ของสเปรดชีต Excel ในไปป์ไลน์อัตโนมัติ คุณแทบจะไม่ต้องการโหลดเอกสารทั้งหมดลงในหน่วยความจำเพียงเพื่อดูว่ามันคืออะไร บ่อยครั้งที่ข้อมูลเมตาดาต้าที่ฝังอยู่ในไฟล์ (ผู้แต่ง, ชื่อเรื่อง, วันที่สร้าง และคุณสมบัติที่กำหนดเอง) ก็เพียงพอที่จะกำหนดเส้นทาง จัดทำดัชนี หรือปฏิเสธเอกสารได้ ในโลกของ Microsoft Office ข้อมูลเมตาดาต้านี้รู้จักกันในชื่อ Document Summary Information

การดึงข้อมูลนี้แบบเนทีฟใน Delphi โดยไม่ต้องพึ่งพา OLE automation (ซึ่งต้องการให้ติดตั้ง Excel บนเครื่องโฮสต์) จำเป็นต้องแยกวิเคราะห์โครงสร้างไฟล์พื้นฐานโดยตรง ในบทความนี้ เราจะมาดูว่าข้อมูลสรุปเอกสารทำงานอย่างไรในไฟล์ Excel และวิธีดึงข้อมูลเหล่านี้อย่างมีประสิทธิภาพ

ทำความเข้าใจ Excel Metadata Streams

ในอดีต ไฟล์ Excel รุ่นเก่า (.xls) จะถูกจัดเก็บในรูปแบบ OLE Compound Document ซึ่งทำหน้าที่เสมือนระบบไฟล์ขนาดเล็กที่มี streams และ storages อย่างมีประสิทธิภาพ ข้อมูลเมตาดาต้าจะอยู่ในสอง streams เฉพาะ:

  • \005SummaryInformation: มีคุณสมบัติมาตรฐาน เช่น Title, Subject, Author, Keywords และ Revision Number
  • \005DocumentSummaryInformation: มีคุณสมบัติแบบขยาย เช่น Company, Manager และคุณสมบัติที่กำหนดเองโดยผู้ใช้

ไฟล์ Excel สมัยใหม่ (.xlsx) ใช้รูปแบบ Office Open XML (OOXML) ซึ่งเป็นโครงสร้าง XML แบบซิป ข้อมูลเมตาดาต้าที่นี่จะอยู่ใน docProps/core.xml, docProps/app.xml และ docProps/custom.xml คอมโพเนนต์การแยกวิเคราะห์ Delphi ที่แข็งแกร่งต้องจัดการโครงสร้างภายในทั้งสองแบบได้อย่างราบรื่นในขณะที่เปิดเผย API ที่เป็นหนึ่งเดียวให้กับนักพัฒนา

การดึงข้อมูลด้วยการเขียนโปรแกรมด้วย HotXLS

การอัปเดตล่าสุดของคอมโพเนนต์ HotXLS ได้แนะนำยูนิตเฉพาะ (เช่น lxXlsSummary) เพื่อแยกและเพิ่มประสิทธิภาพการอ่าน streams สรุปเหล่านี้ แทนที่จะเริ่มการทำงานของเอนจินการแสดงผลเวิร์กบุ๊กแบบเต็ม ตัวอ่านข้อมูลสรุปจะแยกวิเคราะห์เฉพาะ OLE streams หรือโหนด OOXML ที่จำเป็นเท่านั้น

ตัวอย่างการใช้งานจริง

การใช้อินเทอร์เฟซ XlsReadDocumentSummaryInformation และ XlsReadSummaryInformation จะช่วยให้คุณสามารถดึงสตริงเมตาดาต้าได้อย่างรวดเร็ว นี่คือตัวอย่างแนวคิดเกี่ยวกับวิธีที่คุณอาจใช้ API เหล่านี้ในโค้ด Delphi ของคุณ:

uses
  lxXlsSummary;

var
  Summary: TXlsSummaryInfo;
  ExtendedInfo: TXlsDocumentSummaryInfo;
begin
  // Extract standard summary
  Summary := XlsReadSummaryInformation('C:\Data\FinancialReport.xls');
  try
    Writeln('Title: ', Summary.Title);
    Writeln('Author: ', Summary.Author);
    Writeln('Creation Date: ', DateTimeToStr(Summary.CreateTime));
  finally
    Summary.Free;
  end;

  // Extract extended document summary
  ExtendedInfo := XlsReadDocumentSummaryInformation('C:\Data\FinancialReport.xls');
  try
    Writeln('Company: ', ExtendedInfo.Company);
    Writeln('Manager: ', ExtendedInfo.Manager);
  finally
    ExtendedInfo.Free;
  end;
end;

เหตุใดการดึงข้อมูลสรุปโดยเฉพาะจึงมีความสำคัญ

ประโยชน์หลักของแนวทางนี้คือ ประสิทธิภาพและความปลอดภัยของหน่วยความจำ ด้วยการหลีกเลี่ยงการสร้างอินสแตนซ์ของ DOM (Document Object Model) เวิร์กบุ๊กทั้งหมด footprint แอปพลิเคชันของคุณจะยังคงเล็กมาก หากคุณกำลังจัดทำดัชนีไฟล์ Excel 10,000 ไฟล์ผ่านเครือข่ายแชร์ การพยายามแยกวิเคราะห์แต่ละไฟล์อย่างสมบูรณ์จะทำให้หน่วยความจำของคุณทำงานหนักและใช้เวลาหลายชั่วโมง การดึงข้อมูลสรุปโดยเฉพาะจะทำงานเดียวกันนี้ให้เสร็จสิ้นในไม่กี่วินาที

นอกจากนี้ การอ่าน streams แบบเนทีฟยังช่วยให้แอปพลิเคชันของคุณสามารถทำงานเป็นบริการเบื้องหลังหรือบนเซิร์ฟเวอร์แบบ headless โดยไม่ต้องเรียกใช้ Excel.exe เลย ซึ่งเป็นข้อกำหนดที่สำคัญสำหรับสถาปัตยกรรมที่ปรับขนาดได้ในปัจจุบัน

หมายเหตุ: เครื่องมือการแยกวิเคราะห์ Excel และการดึงข้อมูลเมตาดาต้าที่ครอบคลุมมีอยู่ใน HotXLS VCL Component