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

HotXLS MetadataOnly leser arbeidsbokegenskaper, arkenavn, stiler og lenker i et Delphi XLSX-arkiv, og stopper så før noe regneark-celle-XML
MetadataOnly leser hver strukturelle del av arkivet og stopper før regneark-celle-XML. Delphi-arbeidsboken kommer tilbake med arkenavn, synlighet, defined names og stiler, og null celler
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // sett før Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] er 1-basert
      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

HotXLS SelectedSheets parser celler for to navngitte ark av førti i Delphi, mens LoadSheet materialiserer et hoppet-over ark fra det fortsatt åpne arkivet
SelectedSheets parser celle-XML bare for de navngitte arkene, og lar resten forbli tomme stubber som beholder navn og synlighet. LoadSheet realiserer en stubbe senere, forutsatt at kildearkivet fortsatt er åpent
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Senere, når brukeren åpner en fane du hoppet over.
// LoadSheet tar 0-basert posisjon og trenger kildefilen,
// så det virker ikke på en arbeidsbok åpnet fra en strøm
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

Topassers HotXLS oppdagelsesrørledning i Delphi: et kun-metadata-pass avgjør hvilke arbeidsbøker og ark som betyr noe, deretter parser et målrettet pass bare de valgte arkene
Gjennomløp én skanner katalogen kun-metadata og avgjør hvilke filer og ark som betyr noe; gjennomløp to gjenåpner treffene med et arkutvalg. Bare den andre åpningen parser noensinne celle-XML
// Pass 1: oppdagelse
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: målrettet lasting
Workbook := TXLSXWorkbook.Create;
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-Delphi-regnearkkomponentsiden for de støttede formatene og lisensieringen