HotXLS dokáže otvoriť zošit XLSX a nerozparsovať vôbec žiadne bunky pracovného hárku. TXLSXWorkbook.MetadataOnly prečíta vlastnosti zošita, definované názvy, názvy hárkov a stavy viditeľnosti, štýly, tému, pripojenia a externé prepojenia a zastaví sa pred XML bunkiek. Pre skener, ktorý potrebuje vedieť, čo je v adresári zošitov, je to rozdiel medzi minútami a sekundami
Tri súvisiace prepínače dopĺňajú obraz: SelectedSheets parsuje bunky iba pre pomenovanú podmnožinu, LoadSheet materializuje preskočený hárok neskôr z pôvodného archívu a PreserveRawParts skopíruje komprimované bajty nezmenených častí priamo pri ukladaní. Spolu otočia „otvor zošit" z jednej all-or-nothing operácie na niečo, čo sa dá rámovať
Čo sa dá zistiť bez parsovania jedinej bunky?
Viac než väčšina úloh objavu potrebuje. S nastaveným MetadataOnly pred Open sa zošit vráti nesúc svoje názvy hárkov a stavy viditeľnosti, svoje definované názvy, svoje vlastnosti dokumentu, svoje štýly a tému, svoje externé prepojenia a svoje pripojenia. Hárky sú prítomné ako objekty s nula bunkami
To je presne informácia, na ktorej beží katalóg, audit alebo rozhodnutie o smerovaní. Ktoré zošity definujú názov TaxRate? Ktoré majú skryté hárky? Ktoré sa pripájajú na server, ktorý bol vyradený z prevádzky? Odpovedať na tie otázky plným načítaním každého súboru je spôsob, akým sa nočná úloha stane celonočnou úlohou
var
Workbook: TXLSXWorkbook;
I: Integer;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.MetadataOnly := True; // set before Open
Workbook.Open(FileName);
for I := 1 to Workbook.Sheets.Count do // Sheets[] is 1-based
if not Workbook.Sheets[I].Visible then
Report.Add(FileName + ': hidden sheet ' +
Workbook.Sheets[I].Name);
finally
Workbook.Free;
end;
end;
Načítanie dvoch hárkov zo štyridsiatich
SelectedSheets je TStringList názvov hárkov. Keď je neprázdny, Open parsuje XML buniek iba pre hárky, ktoré menuje; každý iný hárok si ponechá správny názov a stav viditeľnosti a nedrží žiadne bunky. Prázdny zoznam znamená predchádzajúce správanie, čo je načítať všetko
Interakcia s MetadataOnly sa oplatí povedať otvorene, pretože jej prevrátenie produkuje mätúci prázdny zošit: MetadataOnly = True prepíše výber a preskočí všetky hárky. Použite jedno alebo druhé. Objav používa len metadata; cielená práca používa výber
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
if Workbook.LoadSheet(ZeroBasedPosition) then
Grid.Refresh;
LoadSheet(Index) materializuje preskočený hárok na požiadanie z pôvodného archívu, čo je to, čo robí tento vzor použiteľným v interaktívnej aplikácii a nie iba v dávke. Otvorte s hárkom, na ktorý sa používateľ pozerá, načítajte ostatných, keď na ne klikne. Archív zostáva otvorený presne z toho dôvodu, takže držte zošit nažive tak dlho, ako by používateľ mohol požiadať o ďalší hárok
Prečo okruh zmení časti, ktoré ste sa nikdy nedotkli?
Pretože naivné uloženie regeneruje všetko. Dekomprimujte tému, postavte objektový model, serializujte ho späť, rekomprimujte — a teraz sa bajty líšia, hoci sa na téme nič nezmenilo. Pre VBA projekty a pivot caches je to horšie než plytvanie, pretože tie časti nesú štruktúru, ktorú objektový model plnereprezentuje
PreserveRawParts to rieši skopírovaním komprimovanej reprezentácie nezmenených častí priamo zo zdrojového archívu počas SaveAs. Téma, VBA projekt, pivot tabuľky a pivot caches sa presunú ako bajty, keď neboli modifikované. Žiadna dekompresia, žiadna rekompresia, žiadne riziko straty niečoho v okruhu serializácie
Cenou je obmedzenie, ktoré ste už mali: zdrojový archív musí byť stále dostupný v čase ukladania. Ak váš workflow prečíta súbor do pamäte, zavrie ho a uloží o hodinu neskôr, raw-copy cesta nemá z čoho kopírovať. Držte zdroj dostupný počas celej životnosti zošita, čo je ten istý predpoklad, ktorý si vynucuje LoadSheet
Pipeline objavu, ktorá sa zámerne otvára znova
Vzor, ktorý funguje v produkcii, má dva prechody a žiadnu chytrosť. Prvý prechod otvorí len metadata a rozhodne. Druhý prechod znova otvorí súbory, na ktorých záleží, s výberom hárkov a urobí prácu. Znovuotvorenie pôsobí ako plytvanie, kým nepočítate, čo sa prvý prechod vyhol: druhé otvorenie je jediné, ktoré parsuje bunky, a parsuje iba hárky, ktoré vybral prvý prechod
// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;
// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);
Nepokúšajte sa povýšiť metadata-only zošit na mieste tým, že by ste príznak vymazali po Open. Príznak sa číta počas otvárania; jeho vymazanie potom nezmení nič na zošite, ktorého XML buniek nikdy nebolo navštívené
Kam to patrí s ostatnými pákami pre veľké súbory
Selektívne načítavanie redukuje to, čo parsujete. Neredukuje to, čo jeden hárok stojí, keď je raz načítaný, a nepomáha, keď skutočne potrebujete každú bunku každého hárku. Pre ten prípad je relevantná práca na strane úložiska, popísaná v poznámkach k bunkovému úložisku po riadkových blokoch a prekryvom intervalových štýlov, a na strane parsovania v paralelnom XLSX parsingu a alokátore pamäte. Keď je úlohou čistý scan bez akejkoľvek úpravy, streaming direct reader preskočí objektový model úplne a prekoná akúkoľvek stratégiu načítavania, ktorá ho buduje
HotXLS otvára XLS a XLSX súbory z natívneho Delphi a C++Builder kódu bez závislosti na Exceli, takže server-side úloha objavu beží bez toho, aby bolo nainštalované čokoľvek okrem vášho vlastného spustiteľného súboru — podporované formáty a licencovanie nájdete na stránke HotXLS spreadsheet komponentu