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;