Odborný článok

Načítavanie XLSX len z metadát a selektívne s HotXLS

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

HotXLS MetadataOnly číta vlastnosti zošita, mená hárkov, štýly a odkazy v archive XLSX Delphi, potom zastane pred akýmkoľvek XML buniek hárku
MetadataOnly číta každú štrukturálnu časť archívu a zastaví pred XML buniek pracovného hárka. Delphi zošit sa vráti s názvami hárkov, viditeľnosťou, defined names a štýlmi a s nulou buniek
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // nastavte pred Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] je indexované od 1
      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

HotXLS SelectedSheets parsuje bunky pre dva pomenované hárky zo štyridsiatich v Delphi, zatiaľ čo LoadSheet zmaterializuje vynechaný hárok zo stále otvoreného archívu
SelectedSheets parsuje XML buniek len pre pomenované hárky a zvyšok necháva ako prázdne stuby, ktoré si držia názov a viditeľnosť. LoadSheet neskôr hmotuje stub, pokiaľ je zdrojový archív stále otvorený
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Neskôr, keď používateľ otvorí kartu, ktorú ste preskočili.
// LoadSheet berie pozíciu od nuly a potrebuje zdrojový súbor,
// takže nefunguje na zošite otvorenom zo streamu
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

Dvojpriebehová pipeline objavovania HotXLS v Delphi: priebeh len-metadáta rozhodne, ktoré zošity a hárky sú dôležité, potom cielený priebeh parsuje len zvolené hárky
Priebeh jedna skenuje adresár metadata-only a rozhodne, ktoré súbory a hárky sa počítajú; priebeh dva znovu otvorí zhody s výberom hárkov. Len druhé otvorenie kedykoľvek parsuje XML buniek
// Prechod 1: objav
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Prechod 2: cielené načítanie
Workbook := TXLSXWorkbook.Create;
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 Delphi spreadsheet komponentu