Teknisk artikkel

Kun-metadata og selektiv XLSX-innlasting med HotXLS

HotXLS kan åpne en XLSX-arbeidsbok og ikke parse en eneste regnearkcelle. TXLSXWorkbook.MetadataOnly leser arbeidsbokegenskaper, definerte navn, arknavn og synlighetstilstander, stiler, tema, tilkoblinger og eksterne lenker, og stopper deretter før celle-XML-en. For en skanner som trenger å vite hva som er i en katalog med arbeidsbøker, er det forskjellen mellom minutter og sekunder

Tre relaterte brytere fullfører bildet: SelectedSheets parser celler for et navngitt delsett, LoadSheet materialiserer et hoppet ark senere fra det opprinnelige arkivet, og PreserveRawParts kopierer de komprimerte bytene til uendrede deler rett gjennom ved lagring. Brukt sammen forvandler de «åpne en arbeidsbok» fra én alt-eller-ingenting-operasjon til noe du kan avgrense

Hva kan du lære uten å parse en eneste celle?

Mer enn de fleste oppdagelsesoppgaver trenger. Med MetadataOnly satt før Open, kommer arbeidsboken tilbake med sine arknavn og synlighetstilstander, sine definerte navn, sine dokumentegenskaper, sine stiler og tema, sine eksterne lenker og sine tilkoblinger. Arkene er til stede som objekter med null celler

Akkurat det er informasjonen en katalog, en revisjon eller en rutingsbeslutning kjører på. Hvilke arbeidsbøker definerer et navn som heter TaxRate? Hvilke har skjulte ark? Hvilke lenker til en tjener som er tatt ut av drift? Å svare på de ved å fullaste hver fil er slik en nattlig jobb blir en hel-natt-jobb

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;

Laste to ark av førti

SelectedSheets er en TStringList med arknavn. Når den er ikke-tom, parser Open celle-XML kun for arkene den navngir; hvert annet ark beholder sitt korrekte navn og synlighetstilstand og holder ingen celler. En tom liste betyr den forrige oppførselen, som er å laste alt

Interaksjonen med MetadataOnly er verdt å slå fast tydelig, fordi å snu den om produserer en forvirrende tom arbeidsbok: MetadataOnly = True overstyrer utvalget og hopper over alle ark. Bruk den ene eller den andre. Oppdagelse bruker kun-metadata; målrettet arbeid bruker et utvalg

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) materialiserer et hoppet ark på forespørsel fra det opprinnelige arkivet, noe som er det som gjør dette mønsteret brukbart i en interaktiv applikasjon snarere enn kun i en gruppe. Åpne med arket brukeren ser på, last de andre når vedkommende klikker. Arkivet forblir åpent av akkurat den grunn, så hold arbeidsboken levende så lenge brukeren kan be om et annet ark

Hvorfor endrer en rundtur deler du aldri rørte?

Fordi en naiv lagring regenererer alt. Dekomprimer temaet, bygg en objektmodell, serialiser den tilbake, rekomprimer — og nå er bytene ulike selv om ingenting om temaet endret seg. For VBA-prosjekter og pivot-mellomlagre er det verre enn sløsing, fordi de delene bærer struktur objektmodellen ikke fullt ut representerer

PreserveRawParts svarer på dette ved å kopiere den komprimerte representasjonen av uendrede deler direkte fra kildearkivet under SaveAs. Tema, VBA-prosjekt, pivot-tabeller og pivot-mellomlagre flyttes over som bytes når de ikke ble endret. Ingen dekompresjon, ingen rekomprimering, ingen risiko for å miste noe i en serialiserings-rundtur

Kostnaden er en begrensning du allerede hadde: kildearkivet må fortsatt være tilgjengelig ved lagringstidspunktet. Hvis din arbeidsflyt leser en fil inn i minne, lukker den og lagrer en time senere, har rå-kopieringsstien ingenting å kopiere fra. Hold kilden nåbar for arbeidsbokens levetid, noe som er det samme kravet LoadSheet stiller

En oppdagelses-pipeline som gjenåpner med vilje

Mønsteret som virker i produksjon har to pass og ingen klypestrek. Pass én åpner kun-metadata og avgjør. Pass to gjenåpner filene som betyr noe med et arkutvalg og gjør jobben. Å gjenåpne føles sløsing til du teller hva pass én unngikk: den andre åpningen er den eneste som parser celler, og den parser kun arkene pass én utvalgte

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

Ikke prøv å forfremme en kun-metadata-arbeidsbok på plass ved å tømme flagget etter Open. Flagget leses under åpning; å tømme det etterpå endrer ingenting om en arbeidsbok hvis celle-XML aldri ble besøkt

Hvor dette passer med de andre store-fil-spakene

Selektiv innlasting reduserer hva du parser. Den reduserer ikke hva et ark koster når det først er lastet, og den hjelper ikke når du genuint trenger hver celle av hvert ark. For det tilfellet ligger det relevante arbeidet på lagringssiden, beskrevet i notatene om radblokk-cellelagring og intervall-stil-overlegg, og på parsing-siden i parallell XLSX-parsing og minneallokatoren. Når oppgaven er en ren skanning uten redigering i det hele tatt, hopper den strømmende direkteleseren over objektmodellen helt og vil slå enhver lastestrategi som bygger en

HotXLS åpner XLS- og XLSX-filer fra ren Delphi- og C++Builder-kode uten Excel-avhengighet, slik at en oppdagelsesjobb på tjenersiden kjører med ingenting installert utover din egen kjørbare — se HotXLS-regnearkkomponentsiden for de støttede formatene og lisensieringen