Odborný článok

Získavanie súhrnných informácií o dokumente zo súborov Excel v Delphi

Tri cesty k vlastnostiam dokumentu

Automatizácia COM cez Excel vie prečítať takmer všetko, ale vyžaduje nainštalovaný Excel, desktopovú reláciu a správne uvoľnenie COM objektov. Preto je vhodná najmä pre interaktívne pracovné stanice, nie pre bezhlavé serverové úlohy

Pri súboroch .xls možno vlastnosti načítať priamo zo streamov sady vlastností OLE2 bez spustenia Excelu. Pri .xlsx sú tie isté údaje v XML súboroch docProps/core.xml a docProps/app.xml v ZIP kontajneri, takže čítanie môže zostať ľahké a nezávislé od platformy

Rozhodnutie závisí od nákladov: COM poskytuje najširšiu kompatibilitu s Excelom, priame čítanie OLE2 a OOXML je vhodnejšie pre indexovanie veľkých dávok, kde nechcete vytvárať celý objektový model zošita

Pri budovaní systémov na správu dokumentov alebo vyhľadávacích indexátorov je rýchle získanie metadát zo súborov nevyhnutné. Pre súbory balíka Microsoft Excel to znamená prístup k štandardným "súhrnným informáciám" (názov, autor, dátum vytvorenia) a rozšíreným vlastnostiam dokumentu (spoločnosť, manažér)

Úloha je však komplikovaná skutočnosťou, že v podnikovom prostredí sa stretnete s dvoma úplne odlišnými formátmi súborov: starším binárnym formátom OLE2 (.xls) a moderným formátom OOXML založeným na ZIP (.xlsx)

Rozdelenie dvoch formátov

Formát XLS (OLE2 Compound Document)

V staršom formáte .xls sú metadáta uložené v rámci Compound File Binary Format (CFBF). Konkrétne sa nachádzajú v streamoch s názvami SummaryInformation a DocumentSummaryInformation. Na ich získanie musíte analyzovať štruktúru zväzkov FAT/MiniFAT štruktúrovaného úložiska OLE a priamo prečítať sady vlastností bez vyvolania Excelu pomocou COM

Formát XLSX (Office Open XML)

V modernom formáte .xlsx je súbor archívom ZIP obsahujúcim XML dokumenty. Súhrnné informácie sú uložené v súbore docProps/core.xml (ktorý obsahuje metaúdaje Dublin Core, ako sú tvorca a dátum úpravy) a docProps/app.xml (ktorý obsahuje vlastnosti aplikácie, ako sú spoločnosť a verzia)

Príklad nezávislý od platformy

Pomocou rozhraní XlsReadDocumentSummaryInformation a XlsReadSummaryInformation môžete rýchlo získať reťazce metadát zo súborov .xls aj .xlsx bez toho, aby ste sa museli starať o základnú architektúru súborového systému

uses
  lxXlsSummary;

var
  Summary: TXlsSummaryInfo;
  ExtendedInfo: TXlsDocumentSummaryInfo;
begin
  // Extract standard summary from an OOXML format seamlessly
  Summary := XlsReadSummaryInformation('C:\Data\FinancialReport.xlsx');
  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.xlsx');
  try
    Writeln('Company: ', ExtendedInfo.Company);
    Writeln('Manager: ', ExtendedInfo.Manager);
  finally
    ExtendedInfo.Free;
  end;
end;

Prečo je vyhradená extrakcia dôležitá

Hlavnou výhodou tohto prístupu je výkon a bezpečnosť pamäte. Tým, že sa vyhnete vytváraniu plného modelu DOM (Document Object Model) zošita a analyzujete iba súbory docProps/core.xml alebo prúdy vlastností OLE, pamäťová stopa vašej aplikácie zostane neuveriteľne malá. Ak indexujete 10 000 súborov Excel na sieťovom disku, pokus o úplnú analýzu každého z nich spotrebuje veľa pamäte a potrvá hodiny. Vyhradená extrakcia súhrnu dokončí rovnakú úlohu v priebehu niekoľkých sekúnd

Natívne čítanie streamov navyše zaisťuje, že vaša aplikácia môže bežať ako služba na pozadí alebo na bezhlavom serveri Linux bez toho, aby sa niekedy spustil Excel.exe, čo je kľúčová požiadavka pre moderné škálovateľné architektúry

Poznámka: Komplexná analýza Excelu a nástroje na extrakciu metadát sú k dispozícii v komponente HotXLS VCL Component

Ďalšie príklady kódu

uses
  lxXlsSummary;

var
  Summary: TXlsSummaryInfo;
  ExtendedInfo: TXlsDocumentSummaryInfo;
begin
  // Extract standard summary from an OOXML format seamlessly
  Summary := XlsReadSummaryInformation('C:\Data\FinancialReport.xlsx');
  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.xlsx');
  try
    Writeln('Company: ', ExtendedInfo.Company);
    Writeln('Manager: ', ExtendedInfo.Manager);
  finally
    ExtendedInfo.Free;
  end;
end;