Artículo técnico

Carga de XLSX solo metadatos y selectiva con HotXLS

HotXLS puede abrir un libro XLSX y no analizar ni una sola celda de hoja de cálculo. TXLSXWorkbook.MetadataOnly lee las propiedades del libro, los nombres definidos, los nombres y estados de visibilidad de las hojas, los estilos, el tema, las conexiones y los vínculos externos, y después se detiene antes del XML de celdas. Para un explorador que necesita saber qué hay en un directorio de libros, esa es la diferencia entre minutos y segundos

Tres conmutadores relacionados completan el panorama: SelectedSheets analiza las celdas de un subconjunto con nombre, LoadSheet materializa después una hoja omitida desde el archivo original, y PreserveRawParts copia directamente los bytes comprimidos de las partes no modificadas al guardar. Usados en conjunto convierten «abrir un libro» de una operación todo o nada en algo que puedes acotar

¿Qué se puede averiguar sin analizar ni una sola celda?

Más de lo que la mayoría de tareas de descubrimiento necesita. Con MetadataOnly activado antes de Open, el libro vuelve con sus nombres de hoja y estados de visibilidad, sus nombres definidos, sus propiedades de documento, sus estilos y tema, sus vínculos externos y sus conexiones. Las hojas están presentes como objetos con cero celdas

Esa es justamente la información sobre la que se ejecutan un catálogo, una auditoría o una decisión de encaminamiento. ¿Qué libros definen un nombre llamado TaxRate? ¿Cuáles tienen hojas ocultas? ¿Cuáles enlazan a un servidor ya dado de baja? Responder a eso cargando completo cada archivo es como un trabajo nocturno se convierte en un trabajo de toda la noche

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;

Cargar dos hojas de cuarenta

SelectedSheets es una TStringList de nombres de hoja. Cuando no está vacía, Open analiza el XML de celdas solo de las hojas que nombra; cualquier otra hoja conserva su nombre correcto y estado de visibilidad y no contiene celdas. Una lista vacía significa el comportamiento anterior, que es cargarlo todo

La interacción con MetadataOnly conviene decirla con claridad, porque invertirla produce un libro vacío desconcertante: MetadataOnly = True anula la selección y omite todas las hojas. Usa uno u otro. El descubrimiento usa solo metadatos; el trabajo dirigido usa una selección

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) materializa bajo demanda una hoja omitida desde el archivo original, que es lo que hace este patrón utilizable en una aplicación interactiva en lugar de solo en un lote. Abre con la hoja que el usuario está mirando, carga las demás cuando haga clic. El archivo permanece abierto precisamente por eso, así que mantén vivo el libro mientras el usuario pueda pedir otra hoja

¿Por qué un viaje de ida y vuelta cambia partes que nunca tocaste?

Porque un guardado ingenuo lo regenera todo. Descomprime el tema, construye un modelo de objetos, lo serializa de vuelta, lo recomprime —y ahora los bytes difieren aunque nada del tema haya cambiado—. Para los proyectos VBA y las cachés de tabla dinámica eso es peor que un desperdicio, porque esas partes portan estructura que el modelo de objetos no representa por completo

PreserveRawParts responde a esto copiando la representación comprimida de las partes no modificadas directamente desde el archivo de origen durante SaveAs. El tema, el proyecto VBA, las tablas dinámicas y las cachés de tabla dinámica se trasladan como bytes cuando no se modificaron. Sin descompresión, sin recompresión, sin riesgo de perder algo en un viaje de ida y vuelta de serialización

El coste es una restricción que ya tenías: el archivo de origen debe seguir disponible al guardar. Si tu flujo lee un archivo en memoria, lo cierra y guarda una hora después, el cauce de copia en bruto no tiene de dónde copiar. Mantén el origen accesible durante toda la vida del libro, que es el mismo requisito que impone LoadSheet

Un flujo de descubrimiento que reabre a propósito

El patrón que funciona en producción tiene dos pasadas y ningún alarde. La pasada uno abre solo metadatos y decide. La pasada dos reabre los archivos que importan con una selección de hojas y hace el trabajo. Reabrir parece un desperdicio hasta que cuentas lo que la pasada uno evitó: la segunda apertura es la única que analiza celdas, y analiza solo las hojas que la pasada uno seleccionó

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

No intentes promover un libro solo metadatos in situ desactivando la marca después de Open. La marca se lee durante la apertura; desactivarla después no cambia nada de un libro cuyo XML de celdas nunca se visitó

Dónde encaja esto con las otras palancas para archivos grandes

La carga selectiva reduce lo que analizas. No reduce lo que cuesta una hoja una vez cargada, y no ayuda cuando de verdad necesitas cada celda de cada hoja. Para ese caso el trabajo relevante está en el lado del almacenamiento, descrito en las notas sobre el almacenamiento de celdas por bloques de filas y los solapados de estilo por intervalos, y en el lado del análisis en el análisis XLSX en paralelo y el asignador de memoria. Cuando la tarea es un puro escaneo sin ninguna edición, el lector directo por streaming se salta el modelo de objetos por completo y batirá cualquier estrategia de carga que construya uno

HotXLS abre archivos XLS y XLSX desde código nativo de Delphi y C++Builder sin dependencia de Excel, de modo que un trabajo de descubrimiento del lado servidor se ejecuta sin nada instalado más allá de tu propio ejecutable; consulta la página del componente de hoja de cálculo HotXLS para los formatos admitidos y la licencia