Articolo tecnico

Caricamento metadata-only e selettivo di XLSX con HotXLS

HotXLS può aprire una cartella di lavoro XLSX senza analizzare una sola cella dei fogli di lavoro. TXLSXWorkbook.MetadataOnly legge le proprietà della cartella di lavoro, i nomi definiti, i nomi dei fogli e gli stati di visibilità, gli stili, il tema, le connessioni e i collegamenti esterni, poi si ferma prima del XML delle celle. Per uno scanner che deve sapere cosa c'è in una directory di cartelle di lavoro, questa è la differenza tra minuti e secondi

Tre interruttori correlati completano il quadro: SelectedSheets analizza le celle per un sottoinsieme nominato, LoadSheet materializza in seguito un foglio saltato dall'archivio originale, e PreserveRawParts copia i byte compressi delle part non modificate dritti al salvataggio. Usati insieme trasformano «apri una cartella di lavoro» da un'operazione tutto-o-niente in qualcosa che puoi delimitare

Cosa puoi appurare senza analizzare una sola cella?

Più di quanto la maggior parte dei task di discovery richieda. Con MetadataOnly impostato prima di Open, la cartella di lavoro torna indietro portando i nomi dei propri fogli e gli stati di visibilità, i nomi definiti, le proprietà del documento, gli stili e il tema, i collegamenti esterni e le connessioni. I fogli sono presenti come oggetti con zero celle

È esattamente l'informazione su cui girano un catalogo, un audit o una decisione di instradamento. Quali cartelle di lavoro definiscono un nome chiamato TaxRate? Quali hanno fogli nascosti? Quali si collegano a un server che è stato dismesso? Rispondere a queste domande caricando completamente ogni file è come un job notturno diventa un job di tutta la notte

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;

Caricare due fogli su quaranta

SelectedSheets è una TStringList di nomi di foglio. Quando non è vuota, Open analizza il XML delle celle solo per i fogli che nomina; ogni altro foglio conserva il proprio nome e stato di visibilità corretti e non contiene celle. Una lista vuota significa il comportamento precedente, che è caricare tutto

L'interazione con MetadataOnly vale la pena dirla chiaramente, perché scambiarla produce una cartella di lavoro vuota sconcertante: MetadataOnly = True sovrascrive la selezione e salta tutti i fogli. Usa l'uno o l'altro. Il discovery usa metadata-only; il lavoro mirato usa una selezione

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) materializza un foglio saltato on demand dall'archivio originale, che è ciò che rende utilizzabile questo pattern in un'applicazione interattiva anziché solo in un batch. Apri con il foglio che l'utente sta guardando, carica gli altri quando ci clicca. L'archivio resta aperto esattamente per questo motivo, così mantieni viva la cartella di lavoro finché l'utente potrebbe chiedere un altro foglio

Perché un round trip cambia part che non hai mai toccato?

Perché un salvataggio naive rigenera tutto. Decomprimi il tema, costruisci un modello a oggetti, serializzalo di nuovo, ricomprimi — ed ecco che i byte differiscono anche se nulla del tema è cambiato. Per i progetti VBA e le pivot cache è peggio che dispendioso, perché quelle part portano struttura che il modello a oggetti non rappresenta del tutto

PreserveRawParts risponde a questo copiando la rappresentazione compressa delle part non modificate direttamente dall'archivio sorgente durante SaveAs. Tema, progetto VBA, tabelle pivot e pivot cache passano come byte quando non sono state modificate. Nessuna decompressione, nessuna ricompressione, nessun rischio di perdere qualcosa in un round trip di serializzazione

Il costo è un vincolo che avevi già: l'archivio sorgente deve essere ancora disponibile al momento del salvataggio. Se il tuo flusso legge un file in memoria, lo chiude e salva un'ora dopo, il percorso di copia raw non ha nulla da cui copiare. Mantieni la sorgente raggiungibile per la durata di vita della cartella di lavoro, che è lo stesso requisito che impone LoadSheet

Una pipeline di discovery che riapre di proposito

Il pattern che funziona in produzione ha due passate e niente finezze. La passata uno apre metadata-only e decide. La passata due riapre i file che contano con una selezione di fogli e fa il lavoro. Riaprire sembra dispendioso finché non conti cosa la passata uno ha evitato: la seconda apertura è l'unica che analizza le celle, e analizza solo i fogli che la passata uno ha selezionato

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

Non provare a promuovere una cartella di lavoro metadata-only sul posto cancellando il flag dopo Open. Il flag viene letto durante l'apertura; cancellarlo dopo non cambia nulla di una cartella di lavoro il cui XML delle celle non è mai stato visitato

Dove si incasta con le altre leve per file grandi

Il caricamento selettivo riduce ciò che analizzi. Non riduce il costo di un foglio una volta caricato, e non aiuta quando hai davvero bisogno di ogni cella di ogni foglio. Per quel caso il lavoro rilevante è sul lato storage, descritto nelle note sulla memorizzazione a blocchi di riga e sovrapposizioni di stile a intervalli, e sul lato parsing nella parsing XLSX parallelo e il memory allocator. Quando il task è una pura scansione senza alcuna modifica, lo streaming direct reader salta del tutto il modello a oggetti e batterà qualsiasi strategia di caricamento che ne costruisca uno

HotXLS apre file XLS e XLSX da codice Delphi e C++Builder nativo senza alcuna dipendenza da Excel, così un job di discovery lato server gira con niente installato oltre al tuo eseguibile — vedi la pagina del componente spreadsheet HotXLS per i formati supportati e il licensing