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

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