Article technique

Chargement XLSX Sélectif et Métadonnées Seules avec HotXLS

HotXLS peut ouvrir un classeur XLSX et n'analyser aucune cellule de feuille de calcul du tout. TXLSXWorkbook.MetadataOnly lit les propriétés du classeur, les noms définis, les noms et états de visibilité des feuilles, les styles, le thème, les connexions et les liaisons externes, puis s'arrête avant le XML de cellules. Pour un scanner qui a besoin de savoir ce qui se trouve dans un répertoire de classeurs, c'est la différence entre des minutes et des secondes

Trois commutateurs liés complètent le tableau : SelectedSheets analyse les cellules pour un sous-ensemble nommé, LoadSheet matérialise une feuille sautée plus tard depuis l'archive originale, et PreserveRawParts copie les octets compressés des parties inchangées directement à la sauvegarde. Utilisés ensemble ils transforment « ouvrir un classeur » d'une opération tout-ou-rien en quelque chose que vous pouvez cadrer

Que peut-on apprendre sans analyser une seule cellule ?

Plus que ce dont la plupart des tâches de découverte ont besoin. Avec MetadataOnly réglé avant Open, le classeur revient portant ses noms de feuilles et états de visibilité, ses noms définis, ses propriétés de document, ses styles et thème, ses liaisons externes et ses connexions. Les feuilles sont présentes comme des objets à zéro cellule

C'est exactement l'information sur laquelle un catalogue, un audit ou une décision de routage s'appuie. Quels classeurs définissent un nom appelé TaxRate ? Lesquels ont des feuilles cachées ? Lesquels se lient à un serveur qui a été désactivé ? Répondre à cela en chargeant entièrement chaque fichier est comment un travail nocturne devient un travail de toute la nuit

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;

Charger deux feuilles sur quarante

SelectedSheets est une TStringList de noms de feuilles. Quand elle est non vide, Open n'analyse le XML de cellules que pour les feuilles qu'elle nomme ; toute autre feuille conserve son nom et état de visibilité corrects et ne contient aucune cellule. Une liste vide signifie le comportement précédent, à savoir tout charger

L interaction avec MetadataOnly vaut la peine d'être énoncée clairement, car l'inverser produit un classeur vide déroutant : MetadataOnly = True outrepasse la sélection et saute toutes les feuilles. Utilisez l'un ou l'autre. La découverte utilise métadonnées seules ; le travail ciblé utilise une sélection

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) matérialise une feuille sautée à la demande depuis l'archive originale, ce qui rend ce motif utilisable dans une application interactive plutôt que seulement dans un lot. Ouvrez avec la feuille que l'utilisateur regarde, chargez les autres quand il clique. L archive reste ouverte exactement pour cette raison, donc gardez le classeur vivant aussi longtemps que l'utilisateur pourrait demander une autre feuille

Pourquoi un aller-retour change-t-il des parties que vous n'avez jamais touchées ?

Parce qu'une sauvegarde naïve régénère tout. Décompressez le thème, construisez un modèle objet, sérialisez-le en retour, recomprimez — et maintenant les octets diffèrent même si rien sur le thème n'a changé. Pour les projets VBA et les caches de tableau croisé dynamique c'est pire que gaspilleur, car ces parties portent une structure que le modèle objet ne représente pas entièrement

PreserveRawParts répond à cela en copiant la représentation compressée des parties inchangées directement depuis l'archive source pendant SaveAs. Thème, projet VBA, tableaux croisés dynamique et caches de tableaux croisés dynamique passent comme octets quand ils n'ont pas été modifiés. Pas de décompression, pas de recompression, pas de risque de perdre quelque chose dans un aller-retour de sérialisation

Le coût est une contrainte que vous aviez déjà : l'archive source doit encore être disponible à la sauvegarde. Si votre flux lit un fichier en mémoire, le ferme et enregistre une heure plus tard, le chemin de copie brute n'a rien à copier. Gardez la source accessible pendant la durée de vie du classeur, ce qui est la même exigence qu'impose LoadSheet

Un pipeline de découverte qui rouvre volontairement

Le motif qui fonctionne en production a deux passes et aucune astuce. La passe un ouvre en métadonnées seules et décide. La passe deux rouvre les fichiers qui comptent avec une sélection de feuilles et fait le travail. Rouvrir paraît gaspilleur jusqu'à ce que vous comptiez ce que la passe un a évité : la seconde ouverture est la seule qui analyse des cellules, et elle n'analyse que les feuilles que la passe un a sélectionnées

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

N essayez pas de promouvoir un classeur en métadonnées seules en place en effaçant l'indicateur après Open. L indicateur est lu pendant l'ouverture ; l'effacer ensuite ne change rien à un classeur dont le XML de cellules n'a jamais été visité

Où cela s'intègre avec les autres leviers de gros fichiers

Le chargement sélectif réduit ce que vous analysez. Il ne réduit pas ce qu'une feuille coûte une fois chargée, et n'aide pas quand vous avez réellement besoin de chaque cellule de chaque feuille. Pour ce cas le travail pertinent est du côté stockage, décrit dans les notes sur le stockage de cellules par blocs de lignes et les surcouches de style par intervalle, et du côté analyse dans l'analyse XLSX parallèle et l'allocateur de mémoire. Quand la tâche est une pure analyse sans aucune édition, le lecteur direct en streaming saute le modèle objet entièrement et battra toute stratégie de chargement qui en construit un

HotXLS ouvre les fichiers XLS et XLSX depuis du code Delphi et C++Builder natif sans aucune dépendance Excel, donc un traitement de découverte côté serveur s'exécute avec rien d'installé au-delà de votre propre exécutable — voir la page composant tableur HotXLS pour les formats et licences pris en charge