Teknisk artikel

Metadata-only og selektiv XLSX-indlæsning med HotXLS

HotXLS kan åbne en XLSX-projektmappe og slet ikke parse nogen regnearks-celler. TXLSXWorkbook.MetadataOnly læser projektmappe-egenskaber, definerede navne, ark-navne og synlighedstilstande, stile, tema, forbindelser og eksterne links, og stopper så før celle-XML. For en scanner, der har brug for at vide, hvad der er i et bibliotek med projektmapper, er det forskellen mellem minutter og sekunder

Tre relaterede kontakt fuldender billedet: SelectedSheets parser celler for et navngivet udsnit, LoadSheet materialiserer et sprunget ark senere fra det oprindelige arkiv, og PreserveRawParts kopierer de komprimerede byte af uændrede dele lige igennem ved gemning. Brugt sammen forvandler de "åbn en projektmappe" fra én alt-eller-intet-operation til noget, du kan afgrænse

Hvad kan du lære uden at parse en eneste celle?

Mere end de fleste opdagelses-opgaver har brug for. Med MetadataOnly sat før Open, kommer projektmappen tilbage med sine ark-navne og synlighedstilstande, sine definerede navne, sine dokument-egenskaber, sine stile og tema, sine eksterne links og sine forbindelser. Arkene er til stede som objekter med nul celler

Det er præcis den information, et katalog, en revision eller en routing-beslutning kører på. Hvilke projektmapper definerer et navn kaldet TaxRate? Hvilke har skjulte ark? Hvilke linker til en server, der er blevet udfaset? At besvare disse ved fuldt at indlæse hver fil er sådan, et natligt job bliver et hele-natten-job

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;

Indlæsning af to ark ud af fyrre

SelectedSheets er en TStringList af ark-navne. Når den er ikke-tom, parser Open kun celle-XML for de ark, den navngiver; hvert andet ark bevarer sit korrekte navn og sin synlighedstilstand og holder ingen celler. En tom liste betyder den tidligere opførsel, som er at indlæse alt

Interaktionen med MetadataOnly er værd at sige lige ud, for at få det baglæns producerer en forvirrende tom projektmappe: MetadataOnly = True tilsidesætter udvælgelsen og springer alle ark over. Brug den ene eller den anden. Opdagelse bruger kun-metadata; målrettet arbejde bruger en udvælgelse

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 sprunget ark on-demand fra det oprindelige arkiv, hvilket er det, der gør dette mønster brugbart i en interaktiv applikation frem for kun i en batch. Åbn med det ark, brugeren kigger på, indlæs de andre, når de klikker. Arkivet forbliver åbent af netop den grund, så hold projektmappen levende, så længe brugeren kan bede om et andet ark

Hvorfor ændrer en rundtur dele, du aldrig rørte?

Fordi en naiv gemning regenererer alt. Dekomprimér temaet, byg en objekt-model, serialisér den tilbage, rekompromér — og nu afviger byte'ene, selvom intet om temaet ændrede sig. For VBA-projekter og pivot-caches er det værre end spild, fordi de dele bærer struktur, som objekt-modellen ikke fuldt ud repræsenterer

PreserveRawParts besvarer dette ved at kopiere den komprimerede repræsentation af uændrede dele direkte fra kilde-arkivet under SaveAs. Tema, VBA-projekt, pivottabeller og pivot-caches flyttes over som byte, når de ikke blev modificeret. Ingen dekomprimering, ingen rekompromering, ingen risiko for at miste noget i en serialiserings-rundtur

Omkostningen er en begrænsning, du allerede havde: kilde-arkivet skal stadig være tilgængeligt ved gemning. Hvis din arbejdsgang læser en fil ind i hukommelsen, lukker den og gemmer en time senere, har raw-copy-stien intet at kopiere fra. Hold kilden nåbar for projektmappens levetid, hvilket er det samme krav, LoadSheet stiller

En opdagelses-pipeline der genåbner med vilje

Mønsteret, der virker i produktion, har to pass og ingen snilde. Pass ét åbner kun-metadata og beslutter. Pass to genåbner de filer, der betyder noget, med en ark-udvælgelse og udfører arbejdet. At genåbne føles spildagtigt, indtil du tæller, hvad pass ét undgik: den anden åbning er den eneste, der parser celler, og den parser kun de ark, pass ét udvalgte

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

Forsøg ikke at forfremme en kun-metadata-projektmappe på plads ved at rydde flaget efter Open. Flaget læses under åbning; at rydde det bagefter ændrer intet ved en projektmappe, hvis celle-XML aldrig blev besøgt

Hvor dette passer med de andre store-fil-arme

Selektiv indlæsning reducerer det, du parser. Den reducerer ikke, hvad et ark koster, når det først er indlæst, og den hjælper ikke, når du reelt har brug for hver celle på hvert ark. Til det tilfælde ligger det relevante arbejde på lagringssiden, beskrevet i noterne om række-blok-celle-lagring og interval-stil-overlays, og på parse-siden i parallel XLSX-parsing og hukommelses-allokatoren. Når opgaven er et rent scan uden redigering overhovedet, springer streaming direct reader objekt-modellen helt over og vil slå enhver indlæsnings-strategi, der bygger én

HotXLS åbner XLS- og XLSX-filer fra native Delphi- og C++Builder-kode uden nogen Excel-afhængighed, så et server-side opdagelses-job kører uden noget installeret ud over din egen eksekverbare — se HotXLS-regnearks-komponent-siden for de understøttede formater og licenser