Teknisk artikel

Metadatabegränsad och selektiv XLSX-inläsning med HotXLS

HotXLS kan öppna en XLSX-arbetsbok och inte tolka en enda kalkylbladscell. TXLSXWorkbook.MetadataOnly läser arbetsboksegenskaper, definierade namn, bladnamn och synlighets tillstånd, stilar, tema, anslutningar och externa länkar, och stannar sedan före cell-XML:en. För en skanner som behöver veta vad som finns i en katalog med arbetsböcker är det skillnaden mellan minuter och sekunder

Tre relaterade omkopplare kompletterar bilden: SelectedSheets tolkar celler för en namngiven delmängd, LoadSheet materialiserar ett överhoppat blad senare från det ursprungliga arkivet, och PreserveRawParts kopierar de komprimerade byten av oförändrade delar rakt igenom vid sparande. Använda tillsammans förvandlar de "öppna en arbetsbok" från en allt-eller-inget-operation till någonting du kan avgränsa

Vad kan du lära dig utan att tolka en enda cell?

Mer än vad de flesta upptäcktsuppgifter behöver. Med MetadataOnly satt före Open kommer arbetsboken tillbaka bärande sina bladnamn och synlighetstillstånd, sina definierade namn, sina dokumentegenskaper, sina stilar och tema, sina externa länkar och sina anslutningar. Bladen finns närvarande som objekt med noll celler

Det är exakt den information en katalog, en revision eller ett dirigeringsbeslut kör på. Vilka arbetsböcker definierar ett namn som kallas TaxRate? Vilka har dolda blad? Vilka länkar till en server som har stängts ner? Att besvara dem genom att fullt ut ladda varje fil är hur ett nattjobb blir ett heldagsjobb

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;

Läsa in två blad av fyrtio

SelectedSheets är en TStringList med bladnamn. När den är icke-tom tolkar Open cell-XML endast för de blad den namnger; alla andra blad behåller sitt korrekta namn och synlighetstillstånd och håller inga celler. En tom lista betyder det tidigare beteendet, vilket är att ladda allt

Interaktionen med MetadataOnly är värd att uttala rakt, eftersom att vända på det producerar en förbryllande tom arbetsbok: MetadataOnly = True åsidosätter valet och hoppar över alla blad. Använd endera. Upptäckt använder metadatabegränsat; målinriktat arbete använder ett urval

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) materialiserar ett överhoppat blad på begäran från det ursprungliga arkivet, vilket är vad som gör detta mönster användbart i en interaktiv applikation i stället för endast i en batch. Öppna med det blad användaren tittar på, ladda de övriga när de klickar. Arkivet förblir öppet av just den anledningen, så behåll arbetsboken levande så länge användaren kan be om ett annat blad

Varför ändrar en rundtur delar du aldrig rörde?

Eftersom ett naivt sparande regenererar allt. Dekomprimera temat, bygg en objektmodell, serialisera den tillbaka, återkomprimera — och nu skiljer sig byten även om ingenting om temat ändrades. För VBA-projekt och pivotcachar är det värre än slöseri, eftersom de delarna bär struktur som objektmodellen inte fullt ut representerar

PreserveRawParts besvarar detta genom att kopiera den komprimerade representationen av oförändrade delar direkt från källarkivet under SaveAs. Tema, VBA-projekt, pivottabeller och pivotcachar flyttas över som byte när de inte modifierades. Ingen dekomprimering, ingen återkomprimering, ingen risk att förlora någonting i en serialiseringsrundtur

Kostnaden är ett villkor du redan hade: källarkivet måste fortfarande vara tillgängligt vid sparandet. Om ditt arbetsflöde läser en fil in i minnet, stänger den och sparar en timme senare har råkopieringsvägen ingenting att kopiera från. Håll källan nåbar under arbetsbokens livstid, vilket är samma krav som LoadSheet ställer

Ett upptäcktsflöde som medvetet öppnar igen

Mönstret som fungerar i produktion har två pass och inget fifflande. Pass ett öppnar metadatabegränsat och beslutar. Pass två öppnar de filer som betyder något igen med ett bladurval och gör arbetet. Att öppna igen känns slösaktigt tills du räknar vad pass ett undvek: den andra öppningen är den enda som tolkar celler, och den tolkar endast de blad pass ett valde

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

Försök inte att befordra en metadatabegränsad arbetsbok på plats genom att rensa flaggan efter Open. Flaggan läses under öppnandet; att rensa den i efterhand ändrar ingenting om en arbetsbok vars cell-XML aldrig besöktes

Var detta passar med de övriga stora-fil-spakarna

Selektiv inläsning minskar vad du tolkar. Det minskar inte vad ett blad kostar när det väl är laddat, och det hjälper inte när du genuint behöver varje cell av varje blad. För det fallet är det relevanta arbetet på lagringssidan, beskrivet i noterna om radblockscellagring och intervallstilsöverlägg, och på tolkningssidan i parallell XLSX-tolkning och minnesallokatorn. När uppgiften är en ren skanning utan redigering alls hoppar den strömmande direkta läsaren över objektmodellen helt och kommer slå vilken inläsningsstrategi som helst som bygger en

HotXLS öppnar XLS- och XLSX-filer från inbyggd Delphi- och C++Builder-kod utan något Excel-beroende, så ett upptäcktsjobb på serversidan kör med ingenting installerat utöver din egen exekverbara fil — se HotXLS kalkylbladskomponentsida för de format och licenser som stöds