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

A HotXLS MetadataOnly beolvassa a munkafüzet tulajdonságait, munkalapneveit, stílusait és hivatkozásait egy Delphi XLSX archívumból, majd megáll minden munkalapcella XML előtt
A MetadataOnly az archívum minden strukturális részét elolvassa, és a munkalap cella XML előtt megáll. A Delphi-munkafüzet munkalapnevekkel, láthatósággal, megnevezett nevekkel és stílusokkal, nulla cellával tér vissza
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // a megnyitás előtt állítandó be
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // a Sheets[] 1-alapú
      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

A HotXLS SelectedSheets cellákat elemez két megnevezett munkalaphoz negyvenből Delphi-ben, míg a LoadSheet anyagiasít egy kihagyott munkalapot a még nyitott archívumból
A SelectedSheets csak a megnevezett munkalapokhoz dolgoz fel cella XML-t, a többit üres csonkként hagyja, amely megtartja a nevet és a láthatóságot. A LoadSheet később materializál egy csonkot, feltéve hogy a forrásarchívum még nyitva van
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Később, amikor a felhasználó egy megkerült lapot nyit meg.
// A LoadSheet a 0-alapú pozíciót kapja, és szüksége van a forrásfájlra,
// ezért nem működik folyamból megnyitott munkafüzeten
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

Kétfázisú HotXLS felderítési folyamat Delphi-ben: egy csak-metaadat fázis eldönti, mely munkafüzetek és munkalapok számítanak, majd egy célzott fázis csak a kiválasztott munkalapokat elemzi
Az első menet csak metaadatot olvas a könyvtárból, és eldönti, mely fájlok és munkalapok számítanak; a második menet munkalapválasztással nyitja újra a találatokat. Csak a második nyitás dolgoz fel valaha cella XML-t
// 1. menet: felderítés
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// 2. menet: célzott betöltés
Workbook := TXLSXWorkbook.Create;
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