Lors du traitement de gros lots de feuilles de calcul Excel dans un pipeline automatisé, vous souhaitez rarement charger l'intégralité du document en mémoire juste pour comprendre ce que c'est. Souvent, les métadonnées intégrées dans le fichier (auteur, titre, date de création et propriétés personnalisées) suffisent pour router, indexer ou rejeter le document. Dans le monde de Microsoft Office, ces métadonnées sont appelées Informations de résumé de document.
Extraire ces informations de manière native dans Delphi sans s'appuyer sur l'automatisation OLE (qui nécessite l'installation d'Excel sur la machine hôte) nécessite d'analyser directement la structure de fichier sous-jacente. Dans cet article, nous examinerons comment les résumés de document fonctionnent dans les fichiers Excel et comment les extraire efficacement à l'aide de l'analyse de flux brute.
Comprendre les flux de métadonnées Excel
Historiquement, les anciens fichiers Excel (.xls) sont stockés dans des formats de document composé OLE (OLE Compound Document), agissant efficacement comme des mini-systèmes de fichiers contenant des flux et des stockages. Les métadonnées sont hébergées dans deux flux spécifiques :
SummaryInformation: Contient des propriétés standard telles que le titre, le sujet, l'auteur, les mots-clés et le numéro de révision.DocumentSummaryInformation: Contient des propriétés étendues telles que la société, le responsable et des propriétés personnalisées définies par l'utilisateur.
Les fichiers Excel modernes (.xlsx) utilisent le format Office Open XML (OOXML), qui est une structure XML compressée (zip). Les métadonnées ici se trouvent dans docProps/core.xml, docProps/app.xml et docProps/custom.xml. Un composant d'analyse Delphi robuste doit gérer de manière transparente les deux structures internes tout en exposant une API unifiée au développeur.
Analyse des documents composés OLE dans Delphi
Pour lire le SummaryInformation à partir d'un ancien fichier `.xls` sans outils tiers, vous devez analyser le stockage structuré OLE (OLE Structured Storage). Microsoft l'expose via l'interface COM IPropertySetStorage. Voici une implémentation Delphi brute qui évite de lancer Excel :
uses
System.SysUtils, System.Win.ComObj, Winapi.ActiveX, Winapi.Windows;
procedure ExtractXlsSummaryInfo(const FileName: string);
var
Stg: IStorage;
PropSetStg: IPropertySetStorage;
PropStg: IPropertyStorage;
PropSpec: TPropSpec;
PropVariant: TPropVariant;
Hr: HRESULT;
begin
// Open the OLE Compound Document
Hr := StgOpenStorage(PWideChar(WideString(FileName)), nil,
STGM_READ or STGM_SHARE_DENY_WRITE, nil, 0, Stg);
if Failed(Hr) then
raise Exception.Create('Failed to open OLE storage. File may not be a valid .xls document.');
// Query for the property set storage interface
if Stg.QueryInterface(IPropertySetStorage, PropSetStg) = S_OK then
begin
// Open the SummaryInformation stream (FMTID_SummaryInformation)
Hr := PropSetStg.Open(FMTID_SummaryInformation, STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg);
if Succeeded(Hr) then
begin
// Read the Author property (PIDSI_AUTHOR = 4)
PropSpec.ulKind := PRSPEC_PROPID;
PropSpec.propid := PIDSI_AUTHOR;
if PropStg.ReadMultiple(1, @PropSpec, @PropVariant) = S_OK then
begin
if PropVariant.vt = VT_LPSTR then
Writeln('Author: ', string(AnsiString(PropVariant.pszVal)));
PropVariantClear(PropVariant);
end;
end;
end;
end;
Extraction programmatique avec HotXLS
Bien que l'API Windows COM fonctionne pour les fichiers `.xls`, elle ne fonctionne pas pour les fichiers `.xlsx` modernes (qui sont des archives ZIP). De plus, l'utilisation de l'API COM de manière multiplateforme (par exemple, sur Linux ou macOS via FireMonkey) est impossible. Les récentes mises à jour du composant HotXLS ont introduit des unités dédiées (par exemple, lxXlsSummary) pour isoler et optimiser la lecture de ces flux de résumé à travers les deux formats de manière totalement native dans le code Delphi.
Un exemple multiplateforme
En utilisant les interfaces XlsReadDocumentSummaryInformation et XlsReadSummaryInformation, vous pouvez récupérer rapidement les chaînes de métadonnées des formats `.xls` et `.xlsx` sans vous soucier de l'architecture du système de fichiers sous-jacent.
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;
Pourquoi l'extraction de résumé dédiée est importante
Le principal avantage de cette approche est la performance et la sécurité de la mémoire. En évitant l'instanciation du DOM (Document Object Model) complet du classeur et en n'analysant que docProps/core.xml ou les flux de propriétés OLE, l'empreinte de votre application reste incroyablement faible. Si vous indexez 10 000 fichiers Excel sur un partage réseau, tenter de les analyser complètement chacun saturera votre mémoire et prendra des heures. L'extraction de résumé dédiée accomplit la même tâche en quelques secondes.
De plus, la lecture native des flux garantit que votre application peut s'exécuter en tant que service d'arrière-plan ou sur un serveur Linux sans interface graphique (headless) sans jamais invoquer Excel.exe, une exigence critique pour les architectures évolutives modernes.
Remarque : Des outils complets d'analyse Excel et d'extraction de métadonnées sont disponibles dans le composant VCL HotXLS.