Et regneark bærer to lag med identitet. Det er cellenettet, og det er dokument-metadataene som følger med: tittel, forfatter, firma, nøkkelord, tidsstempler. Excel viser aldri det andre laget i nettet, men det er likevel det laget Windows-søk indekserer, det SharePoint leser for å gi et dokument en tittel, og det et arkivsystem arkiverer etter. Når en generert arbeidsbok arver sin forfatter (Author) og tittel (Title) fra malen den ble bygd fra, vil ethvert etterfølgende system registrere mal-designeren som forfatter av fire tusen kundekontoutskrifter. Metadataene er feil overalt og konsulteres overalt
HotXLS viser dette laget som vanlige egenskaper på arbeidsboknivå i begge sine motorer: BIFF-fasaden for .xls og OOXML-fasaden for .xlsx. Du leser et felt etter å ha åpnet en fil, og du skriver et felt før du lagrer en. Biblioteket bestemmer hvilken fysisk beholder verdien lander i. Det som er verdt å forstå før du skriver en generator, er hvilke felt hvert format faktisk støtter, hvor disse feltene fysisk lever, og den ene styrende regelen som bestemmer om en .xlsx registrerer metadata i det hele tatt
To formater, to lagringsmodeller
Grunner til at et regnearkbibliotek trenger to metadata-implementasjoner, og grunnen til at halvferdige verktøy stempler ett format riktig og glemmer det andre, is that .xls and .xlsx keep their properties in unrelated places. En BIFF-arbeidsbok skriver dem inn i OLE compound-file-strømmer, hovedsakelig SummaryInformation-egenskapssettet som er eldre enn Excel selv, sammen med den interne WRITEACCESS-posten som navngir hvem som sist lagret filen. En OOXML-arbeidsbok beholder dem som XML-deler i ZIP-pakken, delt etter formål: docProps/core.xml holder Dublin Core-feltene (tittel, skaper, emne, nøkkelord, datoer) og docProps/app.xml holder feltene på applikasjonsnivå som firma og genererende applikasjon, i henhold til ECMA-376 del 1
HotXLS flattens both of those storage models into direct properties of the workbook object. Du tildeler strenger og datoer til arbeidsboken, og den riktige beholderen opprettes for det formatet du lagrer
Stemple genererte arbeidsbøker fra forretnings-postene
På XLSX-siden eksponerer TXLSXWorkbook egenskapene Title, Subject, Author, Keywords, Description, Category, LastModifiedBy, Company, Application og AppVersion som strenger, pluss Created og Modified som TDateTime-verdier der null betyr udefinert. Regelen som tetter arvehullet er enkel: tildel hvert felt ved hver kjøring, og ta verdiene fra forretnings-posten i stedet for å stole på det malen tilfeldigvis måtte inneholde
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open('statement-template.xlsx') <> 1 then
raise Exception.Create('Template not available');
// Overwrite every field: anything left untouched is
// inherited from whoever designed the template.
Book.Title := 'Account Statement 2026-06 / ACME Corp';
Book.Subject := 'Monthly account statement';
Book.Author := 'Billing Service 4.2';
Book.LastModifiedBy := 'Billing Service 4.2';
Book.Company := 'Northwind Financial';
Book.Category := 'Customer Delivery';
Book.Keywords := 'statement;billing;2026-06;acct-10024';
Book.Description := 'Generated document - manual edits are not retained';
Book.Created := Now;
Book.Modified := Now;
Book.SaveAs('statement-10024.xlsx');
finally
Book.Free;
end;
end;
Nøkkelordfeltet (Keywords) fortjener mer oppmerksomhet enn det vanligvis får. Søkeinfrastruktur indekserer det direkte (Windows-søk, SharePoint, og de fleste DMS-produkter), så en semikolon-separert konvensjon som bærer kontonummer og periode gjør hver levert arbeidsbok til en søkbar oppføring uten en database-rundtur. Den samme rekkevidden er også fellen: Egenskaper følger med hver kopi av filen, langt utover tilgangskontrollene til systemet som skrev dem, så personopplysninger hører ikke hjemme der
Tidsstempelparet bærer med seg semantikk det er verdt å fastsette i retningslinjene i stedet for å overlate til tilfeldighetene. Created skal markere tidspunktet da pipelinen din genererte dokumentet, og deretter forbli uendret. Modified er feltet Excel oppdaterer når en mottaker lagrer filen, så et avvik mellom de to etter levering er et klart bevis på at noen har redigert arbeidsboken nedstrøms, noe som løser mer enn én tvist om hvem sine tall et videresendt regneark faktisk inneholder. En felle skjuler seg i den udefinerte tilstanden: den har bokstavelig talt verdien null, ikke et unntak og ikke null (null), så revisjonskode må sjekke for null eksplisitt. Formaterer du en udefinert TDateTime uten den sjekken, fylles loggene dine med en skråsikker, men feilaktig dato i desember 1899
DocPropsTouched: arbeidsboken som sendes uten docProps
Et skrivebeskyttet flagg, DocPropsTouched, styrer skriving av XLSX-egenskaper. En arbeidsbok der ingen egenskaper noen gang ble tildelt, produserer ingen docProps-deler i det hele tatt; HotXLS avstår fra å skrive et tomt metadata-skjelett. Oppførselen er ryddig, og den har to konsekvenser det er verdt å designe rundt
Mottakskode på den konsumerende siden må ikke anta at core.xml finnes i hver pakke. Et verktøy som krever det hardt vil avvise helt gyldige minimalfiler. Og hvis samsvars-retningslinjene dine krever at ethvert utgående dokument bærer minst en generator-identitet, blir det kravet til kode i stedet for en egenskap ved formatet: tildel Application og Author ubetinget i lagringsbanen, siden en uberørt arbeidsbok er helt lovlig i henhold til spesifikasjonen, selv om den i stillhet bryter med retningslinjene dine
Den eldre XLS-overflaten og Comments-fellen
BIFF-fasaden bærer det eldre og mindre egenskapssettet: Title, Subject, Author, Keywords, Comments, Company og Manager, pluss LastSavedBy (et alias for UserName), som skriver WRITEACCESS-posten Excel viser når en annen bruker har låst filen
var
Legacy: IXLSWorkbook; // reference-counted interface: no manual Free
begin
Legacy := TXLSWorkbook.Create;
if Legacy.Open('archive-1999.xls') <= 0 then
raise Exception.Create('Cannot open archive file');
Legacy.Title := 'FY1999 ledger (migrated copy)';
Legacy.Author := 'Archive Migration Batch';
Legacy.Company := 'Northwind Financial';
Legacy.Comments := 'Migrated 2026-06-11; source retained in cold storage';
Legacy.LastSavedBy := 'migration-svc'; // BIFF WRITEACCESS record
Legacy.SaveAs('archive-1999-stamped.xls');
end;
Én navnekollisjon forårsaker tilbakevendende forvirring. Egenskapen Comments på dokumentnivå her er den fritekst-merknaden som vises i filens egenskapsdialog. Den har ingenting å gjøre med cellekommentarer, som er objekter på tegne-laget knyttet til områder via et helt annet API. En koderevisjon som godtar "vi skriver allerede kommentarer (Comments)" uten å sjekke hvilken som menes, har godtatt en påstand om feil funksjon, og det skjer oftere enn det delte navnet skulle tilsi. De to deler fire bokstaver og ikke én byte lagringsplass
Lese metadata ved mottak, og gapet i undersøkelsen
Lesing er symmetrisk. Etter Open, returneres de samme egenskapene ferdig utfylt fra filen, noe som gjør en metadata-revisjon av innkommende arbeidsbøker til en kort løkke
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open(FileName) = 1 then
begin
Writeln(Format('%s | title="%s" author="%s" created=%s',
[ExtractFileName(FileName), Book.Title, Book.Author,
FormatDateTime('yyyy-mm-dd', Book.Created)]));
if Book.Created = 0 then
Writeln(' no creation date recorded');
end;
finally
Book.Free;
end;
end;
Planlegg rundt én begrensning mens du gjør dette. Det finnes ingen egenskaps-undersøkelse alene. GetSheetNames kan liste ark uten å laste inn en arbeidsbok, men å lese Title eller Author krever en fullstendig Open, så metadata-sortering over et stort arkiv betaler full tolke-kostnad for hver fil. På BIFF-siden kan du redusere den kostnaden for skrivebeskyttede revisjoner ved å sette _DisableGraphics til sann før åpning, noe som hopper over tegne-laget helt. Det passer til en løkke som bare leser egenskaper og cellestatistikk, og det er helt feil i det øyeblikket den samme instansen kan komme til å lagre, fordi det overhoppede tegneinnholdet da vil bli tapt. Når ark-strukturen alene kan forhåndsfiltrere settet (enkeltarks-eksporter er den opplagte tingen å hoppe over), reduserer de rimelige teknikkene i artikkelen vår om ark-opplisting og lett inspeksjon hvor mange filer som når den kostbare fasen. Og på bulk-stemplingsjobber, der tusenvis av utdata skrives i stedet for å bli inspisert, fortsetter skrivesidens ytelsesmønstre i artikkelen vår om strømmende skriving for batchjobber uten endring, siden tildeling av egenskaper ikke legger til noe målbart på lagringstiden
Krysse formater og begrense lekkasjen
Egenskaper går greit tur-retur innenfor en enkelt fasade: åpne en .xlsx, rediger den, lagre den, og settet kommer tilbake intakt. Å krysse formater er der antakelsen om likhet bryter sammen, fordi feltene i BIFF og OOXML ikke stemmer overens en-til-en. BIFF har Manager og ingen tidsstempler; OOXML har Category, Description og paret Created/Modified. En konverterer som kopierer blindt mister alt det mottakende formatet ikke kan inneholde, så kartlegg feltene eksplisitt og sett kartleggingen i sjekklisten for konvertering ved siden av alt annet som ikke overlever turen
Lekkasjen som mal-arv åpner, går den andre veien: informasjon du aldri hadde til hensikt å sende ut. Forfatternavn, interne prosjektetiketter parkert i nøkkelord, en kladd-tittel ingen ryddet bort. "Skriv over alt"-disiplinen fra generatoren ovenfor er hele forsvaret, og det er verdt å verifisere på samme måte som en utenforstående ville gjort: ved å åpne Egenskaper-dialogen som enhver kunde kan nå, eller by unzipping the .xlsx and reading docProps/core.xml straight from the package. Det du ser der, er nøyaktig hva alle indekserere oppstrøms ser
Den synligheten nedstrøms er også grunnen til at noen få felt fortjener mer oppmerksomhet enn resten. Tittel (Title), forfatter (Author), nøkkelord (Keywords, som fremstår som tagger) og kommentarer (Comments) eller beskrivelse (Description) bærer det meste av indekseringsvekten i SharePoint og Windows-søk. En tittel som genuint er unik per dokument, og som bærer perioden og kontoen, gjør mer for søkbarheten enn noen mappe-navnstruktur lagt på toppen, og det koster en tildeling per lagring
Dokumentegenskaper er den billigste profesjonelle finishen en generert arbeidsbok kan bære, og den vanligste feilen som sendes ut når ingen eier dem. Begge egenskapsoverflatene beskrevet her tilhører HotXLS Component, som skriver dem opprinnelig for XLS og XLSX uten Excel-automatisering