Preglednica nosi dve plasti identitete. Obstaja mreža celic in obstajajo metapodatki dokumenta, ki jo spremljajo: naslov, avtor, podjetje, ključne besede in časovni žigi. Excel te druge plasti nikoli ne prikaže v mreži, vendar je to plast, ki jo indeksira Windows Search, iz katere SharePoint prebere naslov dokumenta in po kateri datoteke razvršča sistem za upravljanje zapisov. Če generirani delovni zvezek podeduje svojega avtorja in naslov iz predloge, na podlagi katere je bil ustvarjen, bo vsak sistem v nadaljnji verigi zabeležil oblikovalca predloge kot avtorja tisočev strankinih izpiskov. Ti metapodatki niso pravilni nikjer, a se uporabljajo povsod.
Knjižnica HotXLS to plast izpostavi kot običajne lastnosti na ravni delovnega zvezka pri obeh svojih mehanizmih: fasadi BIFF za .xls in fasadi OOXML za .xlsx. Polje preberete po odpiranju datoteke in ga zapišete pred shranjevanjem. Knjižnica sama določi, v kateri fizični vsebnik bo vrednost zapisana. Preden napišete generator, je koristno razumeti, katera polja posamezen format sploh podpira, kje se ta polja fizično nahajajo in katero ključno pravilo določa, ali bo datoteka .xlsx sploh shranila kakšne metapodatke.
Dva formata, dva modela shranjevanja
Razlog, zakaj knjižnica za preglednice potrebuje dve implementaciji metapodatkov in zakaj nedokončana orodja en format zapišejo pravilno, drugega pa pozabijo, je v tem, da formata .xls in .xlsx svoje lastnosti hranita na povsem različnih mestih. Delovni zvezek BIFF jih zapiše v tokove sestavljenih datotek OLE (Summary OLE Streams), predvsem v nabor lastnosti SummaryInformation, ki je starejši od samega Excela, ter v zapis WRITEACCESS znotraj toka, ki poimenuje tistega, ki je datoteko nazadnje shranil. Delovni zvezek OOXML pa jih hrani kot dele XML znotraj paketa zip, razdeljene glede na namen: docProps/core.xml vsebuje polja standarda Dublin Core (naslov, avtor, zadeva, ključne besede, datumi), docProps/app.xml pa polja na ravni aplikacije, kot sta podjetje in program za generiranje, skladno s standardom ECMA-376 Part 1.
HotXLS oba modela shranjevanja poenostavi v neposredne lastnosti objekta delovnega zvezka. Nikoli vam ni treba ročno odpirati tokov lastnosti ali urejati delov XML. Delovnemu zvezku preprosto dodelite nize in datume, ustrezen vsebnik pa se samodejno ustvari glede na format, v katerega shranjujete.
Označevanje generiranih delovnih zvezkov s poslovnimi podatki
Na strani XLSX razred TXLSXWorkbook izpostavlja lastnosti Title, Subject, Author, Keywords, Description, Category, LastModifiedBy, Company, Application in AppVersion kot nize ter Created in Modified kot vrednosti TDateTime, pri čemer ničla pomeni nenastavljeno vrednost. Pravilo, ki odpravlja tveganje dedovanja metapodatkov predloge, je preprosto: ob vsakem zagonu dodelite vrednosti vsem poljem na podlagi poslovnih zapisov, namesto da bi zaupali podatkom, ki so ostali v predlogi.
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;
Polje Keywords (ključne besede) si zasluži več pozornosti, kot jo običajno prejme. Iskalna infrastruktura, kot so Windows Search, SharePoint in večina sistemov za upravljanje dokumentov (DMS), ga indeksira dobesedno, zato uporaba podpičij za ločevanje številk računov in obdobij spremeni vsak dostavljen delovni zvezek v enostavno najdljiv zapis brez dodatnih poizvedb v bazi podatkov. Vendar pa ima ta dosegljivost svojo slabost. Metapodatki potujejo z vsako kopijo datoteke daleč izven nadzora dostopa sistema, ki jo je ustvaril, zato vanje ne sodijo osebni podatki.
Časovni žigi imajo določen pomen, ki ga je bolje opredeliti v pravilih podjetja kot pa prepustiti navadi. Lastnost Created (ustvarjeno) bi morala označevati trenutek, ko je vaš sistem ustvaril dokument, in nato ostati nespremenjena. Lastnost Modified (spremenjeno) pa je polje, ki ga Excel posodobi vsakič, ko prejemnik shrani datoteko. Razhajanje med tema dvema vrednostma po dostavi je jasen dokaz, da je nekdo naknadno urejal delovni zvezek, kar lahko razreši marsikateri spor o tem, čije številke so v poslanem dokumentu. Past se skriva v nenastavljenem stanju: to je dobesedno vrednost nič, ne pa izjema ali vrednost null, zato mora revizijska koda izrecno preverjati vrednost nič. Če formatirate nenastavljen TDateTime brez te zaščite, se bodo vaši dnevniki napolnili z napačnim datumom iz decembra 1899.
DocPropsTouched: delovni zvezek, ki se pošlje brez metapodatkov docProps
Zastavica samo za branje DocPropsTouched nadzoruje zapisovalnik lastnosti za XLSX. Delovni zvezek, v katerem ni bila nikoli dodeljena nobena lastnost, ne ustvari nobenih delov docProps; HotXLS ne zapisuje praznih metapodatkovnih struktur. To obnašanje je čisto in ima dve posledici, ki ju je treba upoštevati pri načrtovanju.
Uvozna koda na strani prejemnika ne sme predvidevati, da datoteka core.xml obstaja v vsakem paketu. Orodje, ki to izrecno zahteva, bo zavrnilo povsem veljavne minimalne datoteke. Če pa vaša varnostna pravila zahtevajo, da mora vsak odhodni dokument vsebovati vsaj identiteto generatorja, mora to postati del kode in ne lastnost formata: lastnosti Application in Author dodelite brezpogojno ob shranjevanju, saj je nespremenjen delovni zvezek po specifikaciji povsem zakonit, čeprav morda krši vaša interna pravila.
Zapis starejšega formata XLS in past s komentarji
Fasada BIFF vsebuje starejši, ožji nabor polj: Title, Subject, Author, Keywords, Comments, Company in Manager ter LastSavedBy (alias za UserName), ki zapiše zapis WRITEACCESS, ki ga Excel prikaže, ko je datoteka zaklenjena s strani drugega uporabnika.
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;
Eno izmed poimenovanj povzroča pogosto zmedo. Lastnost Comments (komentarji) na ravni dokumenta je poljubno besedilo, prikaže se v pogovornem oknu z lastnostmi datoteke. Nima nikakršne povezave s komentarji v celicah, ki so objekti na risalni plasti, pritrjeni na obsege celic prek povsem drugega vmesnika API. Pregled kode, ki sprejme trditev "komentarje že zapisujemo", ne da bi preveril, za katere komentarje gre, je sprejel napačno trditev. Obe funkciji si delita isto ime, nimata pa niti enega skupnega bajta v shrambi.
Branje metapodatkov ob uvozu in omejitve pregledovanja
Branje je simetrično. Po klicu Open se iz datoteke preberejo iste lastnosti, kar revizijo metapodatkov prejetih delovnih zvezkov spremeni v kratko zanko.
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;
Pri tem pa upoštevajte eno omejitev. Hitro preverjanje samo metapodatkov ni mogoče. Funkcija GetSheetNames sicer lahko izpiše imena listov brez nalaganja celotnega delovnega zvezka, vendar branje lastnosti, kot sta Title ali Author, zahteva celoten klic Open, zato revizija metapodatkov v velikem arhivu zahteva polno nalaganje vsake datoteke. Na strani BIFF lahko ta strošek za revizije samo za branje zmanjšate tako, da pred odpiranjem nastavite _DisableGraphics na true, kar preskoči celotno risalno plast. To je primerno za zanke, ki le berejo lastnosti in statistiko celic, je pa popolnoma napačno, če boste to datoteko tudi shranili, saj bi se preskočena risalna vsebina izgubila. Ko lahko že sama struktura listov vnaprej filtrira nabor datotek, so tehnike, opisane v članku o seznamu listov in hitrem pregledu, idealne za zmanjšanje števila datotek, ki potrebujejo polno branje. Pri masovnem označevanju, kjer se piše tisoče izhodnih datotek, pa se vzorci hitrosti zapisovanja iz članka o pretočnem pisanju za paketna opravila prenesejo brez sprememb, saj dodeljevanje lastnosti ne vpliva zaznavno na čas shranjevanja.
Prehajanje med formati in preprečevanje uhajanja podatkov
Lastnosti se nemoteno prenašajo znotraj posamezne fasade: odprete datoteko .xlsx, jo uredite, shranite in lastnosti ostanejo nespremenjene. Prehajanje med formati pa je točka, kjer se predpostavka o enakosti poruši, saj se nabora polj BIFF in OOXML ne ujemata povsem. BIFF ima polje Manager in nima časovnih žigov; OOXML ima polji Category in Description ter par Created/Modified. Pretvornik, ki slepo kopira podatke, bo izgubil tisto, česar ciljni format ne podpira, zato polja preslikajte eksplicitno in to preslikavo dodajte na svoj kontrolni seznam za pretvorbo.
Uhajanje podatkov, ki ga omogoča dedovanje predlog, deluje v nasprotni smeri: pošiljanje informacij, ki jih nikoli niste nameravali dati v javnost. Imena avtorjev, interne oznake projektov med ključnimi besedami ali osnutek naslova, ki ga ni nihče odstranil. Pravilo prepisovanja vsega je najboljša obramba, to pa je priporočljivo preveriti tako, kot bi to storil zunanji uporabnik: z odpiranjem pogovornega okna z lastnostmi v Excelu ali z razpakiranjem datoteke .xlsx in branjem docProps/core.xml neposredno iz paketa. Kar vidite tam, je natanko tisto, kar vidi vsak iskalnik v nadaljevanju.
Ta vidnost v nadaljnjih sistemih je tudi razlog, zakaj nekatera polja zahtevajo več skrbi kot druga. Naslov (Title), avtor (Author), ključne besede (Keywords, ki se prikažejo kot oznake) in komentarji (Comments) ali opis (Description) nosijo največjo težo pri indeksiranju v SharePointu in Windows Searchu. Naslov, ki je resnično edinstven za vsak dokument in vsebuje obdobje ter številko računa, pripomore k najdljivosti veliko bolj kot kateri koli sistem poimenovanja map, stane pa vas le eno dodelitev ob shranjevanju.
Lastnosti dokumenta so najcenejši profesionalni popravek, ki ga lahko vsebuje generirani delovni zvezek, in hkrati najpogostejša napaka, ko nihče ne prevzame odgovornosti zanje. Obe zgoraj opisani površini lastnosti sta del knjižnice HotXLS Component, ki jih piše izvorno za XLS in XLSX brez uporabe avtomatizacije Excela.