Når du behandler store grupper med Excel-regneark i en automatisert rørledning, ønsker du sjelden å laste inn hele dokumentet i minnet bare for å finne ut hva det er. Ofte er metadataene innebygd i filen (forfatter, tittel, opprettelsesdato og egendefinerte egenskaper) nok til å rute, indeksere eller avvise dokumentet. I Microsoft Office-verdenen er disse metadataene kjent som dokumentsammendragsinformasjon
Å trekke ut denne informasjonen opprinnelig i Delphi uten å stole på OLE-automatisering (som krever at Excel er installert på vertsmaskinen) krever å analysere den underliggende filstrukturen direkte. I denne artikkelen skal vi se på hvordan dokumentsammendrag fungerer i Excel-filer og hvordan du trekker dem ut effektivt
Metode 1: COM-automatisering leser alt til desktoppris
COM-automatisering gir full dekning gjennom Excels objektmodell, inkludert standardegenskaper, utvidede egenskaper og egendefinerte egenskaper via BuiltinDocumentProperties og CustomDocumentProperties. En udefinert egenskap kan kaste EOleException når Value leses, så leseren må behandle dette som «ikke angitt»
Metode 2: .xls lagrer egenskaper i OLE-egenskapsstrømmer
\005SummaryInformation: Inneholder standardegenskaper som tittel, emne, forfatter, nøkkelord og revisjonsnummer\005DocumentSummaryInformation: Inneholder utvidede egenskaper som selskap, leder og egendefinerte brukerdefinerte egenskaper
Moderne Excel-filer (.xlsx) bruker Office Open XML (OOXML)-formatet, som er en zippet XML-struktur. Metadataene her ligger i docProps/core.xml, docProps/app.xml og docProps/custom.xml. En robust Delphi-analyseringskomponent må sømløst håndtere begge interne strukturer, samtidig som den eksponerer en enhetlig API for utvikleren
Metode 3: .xlsx lagrer docProps som XML i zip-filen
Nylige oppdateringer til HotXLS-komponenten introduserte dedikerte enheter (for eksempel lxXlsSummary) for å isolere og optimalisere lesingen av disse sammendragsstrømmene. I stedet for å starte opp den fulle gjengivelsesmotoren for arbeidsboken, analyserer sammendragsleseren bare de spesifikke OLE-strømmene eller OOXML-nodene som kreves
Et praktisk eksempel
Ved å bruke grensesnittene XlsReadDocumentSummaryInformation og XlsReadSummaryInformation kan du raskt hente metadatastrengene. Her er et konseptuelt eksempel på hvordan du kan bruke disse API-ene i din Delphi-kode:
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;
Kostnadsbildet og når et bibliotek slår begge parserne
Den primære fordelen med denne tilnærmingen er ytelse og minnesikkerhet. Ved å unngå instansiering av den fulle arbeidsbok-DOM-en (Document Object Model), forblir applikasjonens fotavtrykk utrolig lite. Hvis du indekserer 10 000 Excel-filer over en nettverksdeling, vil det å forsøke å fullstendig analysere hver av dem belaste minnet ditt og ta timer. Dedikert ekstrahering av sammendrag fullfører samme oppgave på sekunder
Videre sikrer det å lese strømmene direkte at applikasjonen din kan kjøre som en bakgrunnstjeneste eller på en hodeløs server uten noen gang å starte Excel.exe (et kritisk krav for moderne skalerbare arkitekturer)
Merk: Omfattende verktøy for Excel-analysering og metadataekstrahering er tilgjengelige i HotXLS VCL Component
\nFlere kodeeksempler
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;