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

HotXLS MetadataOnly læser projektmappeegenskaber, arkenavne, stilarter og links i et Delphi XLSX-arkiv og stopper derefter før nogen regnearkscelle-XML
MetadataOnly læser hver strukturel del af arkivet og stopper før regnearkets celle-XML. Delphi-projektmappen kommer tilbage med arkenavne, synlighed, defined names og stilarter — og nul celler
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // indstilles før Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] er 1-baseret
      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

HotXLS SelectedSheets parser celler for to navngivne ark ud af fyrre i Delphi, mens LoadSheet materialiserer et sprunget ark fra det stadig åbne arkiv
SelectedSheets parser celle-XML kun for de navngivne ark og efterlader resten som tomme stubs, der bevarer navn og synlighed. LoadSheet materialiserer en stub senere, forudsat at kildearkivet stadig er åbent
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Senere, når brugeren åbner en fane, du sprang over.
// LoadSheet tager den 0-baserede position og behøver kildefilen,
// så den virker ikke på en projektmappe åbnet fra en strøm
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

To-pas HotXLS discovery-pipeline i Delphi: et metadata-only-pas beslutter, hvilke projektmapper og ark der betyder noget, derefter parser et målrettet pas kun de valgte ark
Runde én skanner directory metadata-only og beslutter, hvilke filer og ark der betyder noget; runde to genåbner matchene med et arkudvalg. Kun den anden åbning parser nogensinde celle-XML
// Pass 1: opdagelse
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: målrettet indlæsning
Workbook := TXLSXWorkbook.Create;
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-Delphi-regnearks-komponent-siden for de understøttede formater og licenser