Műszaki cikk

Csak-metaadat és szelektív XLSX-betöltés HotXLS-szel

A HotXLS képes egy XLSX-munkafüzetet megnyitni és egyetlen munkalapcellát sem elemezni. A TXLSXWorkbook.MetadataOnly beolvassa a munkafüzet-tulajdonságokat, definiált neveket, munkalapneveket és láthatósági állapotokat, stílusokat, témát, kapcsolatokat és külső hivatkozásokat, majd megáll a cella-XML előtt. Egy olyan vizsgáló számára, amelynek tudnia kell, mi van egy munkafüzet-könyvtárban, ez a különbség percek és másodpercek között

Három kapcsolódó kapcsoló teljesíti ki a képet: a SelectedSheets egy megnevezett részönkre elemez cellákat, a LoadSheet egy kihagyott munkalapot később anyagiasít az eredeti archívumból, a PreserveRawParts pedig az változatlan részek tömörített bájtjait egyenesen átmásolja mentéskor. Együtt használva a „munkafüzet megnyitása”-t egy mindent-vagy-semmi műveletből olyasmivé alakítják, amit hatókörözni lehet

Mit tudhatunk meg egyetlen cella elemzése nélkül?

Többet, mint amennyit a legtöbb felfedező feladat igényel. Ha a MetadataOnly az Open előtt True-ra van állítva, a munkafüzet visszatér a munkalapneveivel és láthatósági állapotaival, a definiált neveivel, a dokumentumtulajdonságaival, a stílusaival és témájával, a külső hivatkozásaival és a kapcsolataival. A munkalapok nulla cellával rendelkező objektumként vannak jelen

Ez pontosan az az információ, amelyen egy katalógus, egy audit vagy egy útválasztási döntés fut. Mely munkafüzetek definiálnak egy TaxRate nevű nevet? Melyek rendelkeznek rejtett munkalapokkal? Melyek hivatkoznak egy olyan szerverre, amelyet leszereltek? Ezekre úgy válaszolni, hogy minden fájlt teljesen betöltünk, az az út, ahogy egy éjszakai feladat éjsaka-all-feladattá válik

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;

Két munkalap betöltése negyvenből

A SelectedSheets a munkalnevek TStringList-je. Amikor nem üres, az Open csak az általa megnevezett munkalapokra elemez cella-XML-t; minden más munkalap megtartja a helyes nevét és láthatósági állapotát, és nem tartalmaz cellákat. Egy üres lista a korábbi viselkedést jelenti, amely mindennek betöltése

A MetadataOnly-val való interakciót érdemes nyíltan kimondani, mert a megfordítása egy zavarba ejtő üres munkafüzetet eredményez: a MetadataOnly = True felülírja a kiválasztást, és minden munkalapot átugrik. Használjuk az egyiket vagy a másikat. A felfedezés metaadat-only-t használ; a célzott munka kiválasztást

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;

A LoadSheet(Index) igény szerint anyagiasít egy kihagyott munkalapot az eredeti archívumból, ami teszi, hogy ez a minta interaktív alkalmazásban is használható legyen, nem csak kötegben. Nyissuk meg azzal a munkalappal, amelyet a felhasználó néz, a többit töltsük be, amikor rákattintanak. Az archívum pontosan ezért marad nyitva, így tartsuk életben a munkafüzetet addig, amíg a felhasználó kérhet egy másik munkalapot

Miért változtat egy oda-vissza menet olyan részeket, amelyeket sosem érintettél?

Mert egy naív mentés mindent újragenerál. Csomagold ki a témát, építs fel egy objektummodellt, szerializáld vissza, recomprimáld — és most a bájtok eltérnek, annak ellenére, hogy a témában semmi sem változott. VBA-projektek és pivot-gyorsítótárak esetén ez rosszabb, mint pazarló, mert ezek a részek olyan szerkezetet hordoznak, amelyet az objektummodell nem teljesen képvisel

A PreserveRawParts erre válaszol azzal, hogy a változatlan részek tömörített reprezentációját közvetlenül a forrásarchívumból másolja át SaveAs közben. Téma, VBA-projekt, pivot-táblák és pivot-gyorsítótárakk bájtként mozognak át, amikor nem lettek módosítva. Nincs dekomprimálás, nincs recomprimálás, nincs kockázata annak, hogy valami elveszik egy szerializációs oda-vissza menetben

A költsége egy olyan megszorítás, amely már amúgy is megvolt: a forrásarchívumnak mentéskor még elérhetőnek kell lennie. Ha a workflow egy fájlt a memóriába olvas, bezárja, és egy órával később ment, a nyers-másolási útnak nincs mit másolnia. Tartsuk a forrást elérhetőn a munkafüzet élettartama alatt, ami ugyanaz a követelmény, amelyet a LoadSheet is megkövetel

Egy felfedező futószalag, amely szándékosan újra megnyit

Az a minta, amely a termelésben működik, két menetből áll, és nincs benne okoskodás. Az első menet metaadat-only-t nyit meg és dönt. A második menet újra megnyitja azokat a fájlokat, amelyek számítanak, egy munkalap-kiválasztással, és elvégzi a munkát. Az újra megnyitás pazarlásnak tűnik, amíg el nem számoljuk, mit avoided meg az első menet: a második nyitás az egyetlen, amely cellákat elemez, és csak azokat a munkalapokat, amelyeket az első kiválasztott

// 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);

Ne próbáljuk egy metaadat-only munkafüzetet helyben előléptetni a jelölő Open utáni törlésével. A jelölő megnyitás közben lesz beolvasva; utólagos törlése semmit nem változtat egy olyan munkafüzetnél, amelynek cella-XML-je sosem lett meglátogatva

Hova illeszkedik ez a többi nagy-fájlkaronfogással

A szelektív betöltés csökkenti, amit elemzünk. Nem csökkenti, amibe egy munkalap kerül, ha már be van töltve, és nem segít, amikor valóban minden cellájára szükségünk van minden munkalapnak. Erre az esetre a releváns munka a tárolási oldalon van, amelyet a sorblokkos cellatárolás és intervallum-stílus-átfedések jegyzetei írnak le, és az elemzési oldalon a párhuzamos XLSX-elemzés és a memóriafoglaló témában. Amikor a feladat tiszta vizsgálat egyáltalán nem szerkesztéssel, a folyamatos közvetlen olvasó teljesen átugorja az objektummodellt, és megver minden olyan betöltési stratégiát, amely felépít egyet

A HotXLS natív Delphi és C++Builder kódból nyit meg XLS és XLSX fájlokat Excel-függőség nélkül, így egy szerveroldali felfedező feladat a saját futtatható állományán kívül semmivel sem fut — a támogatott formátumokat és a licencelést a HotXLS táblázatkezelő komponens oldal tartalmazza