HotXLS puede abrir un libro XLSX y no analizar ninguna 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 enlaces externos, y luego 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 interruptores relacionados completan el cuadro: SelectedSheets analiza las celdas de un subconjunto nombrado, LoadSheet materializa después una hoja omitida desde el archivo original, y PreserveRawParts copia los bytes comprimidos de las partes sin cambios directamente en el guardado. Usados en conjunto convierten «abrir un libro» de una operación todo o nada en algo que puedes acotar
¿Qué puedes saber sin analizar una sola celda?
Más de lo que la mayoría de las tareas de descubrimiento necesita. Con MetadataOnly activado antes de Open, el libro regresa llevando los nombres y estados de visibilidad de sus hojas, sus nombres definidos, sus propiedades de documento, sus estilos y tema, sus enlaces externos y sus conexiones. Las hojas están presentes como objetos con cero celdas
Esa es justamente la información sobre la que corre un catálogo, una auditoría o una decisión de ruteo. ¿Qué libros definen un nombre llamado TaxRate? ¿Cuáles tienen hojas ocultas? ¿Cuáles enlazan a un servidor dado de baja? Responder eso cargando cada archivo por completo es cómo 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 un TStringList de nombres de hojas. Cuando no está vacío, Open analiza el XML de celdas solo para las hojas que nombra; cualquier otra hoja conserva su nombre y estado de visibilidad correctos y no contiene celdas. Una lista vacía significa el comportamiento anterior, que es cargar todo
La interacción con MetadataOnly vale la pena declararla claramente, 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 vuelve utilizable este patrón en una aplicación interactiva en vez 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 el libro vivo mientras el usuario pueda pedir otra hoja
¿Por qué un ciclo de ida y vuelta cambia partes que nunca tocaste?
Porque un guardado ingenuo 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 proyectos VBA y cachés de tabla dinámica eso es peor que desperdicio, porque esas partes llevan estructura que el modelo de objetos no representa por completo
PreserveRawParts responde a esto copiando la representación comprimida de las partes sin cambios 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 fueron modificados. Sin descompresión, sin recompresión, sin riesgo de perder algo en un ciclo de serialización
El costo es una restricción que ya tenías: el archivo de origen debe seguir disponible al momento de guardar. Si tu flujo lee un archivo a memoria, lo cierra y guarda una hora después, la ruta de copia en crudo no tiene de dónde copiar. Mantén la fuente 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 nada de inventiva. La pasada uno abre solo con metadatos y decide. La pasada dos reabre los archivos que importan con una selección de hojas y hace el trabajo. Reabrir parece 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 con metadatos en el mismo lugar limpiando la bandera después de Open. La bandera se lee durante la apertura; limpiarla después no cambia nada sobre 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á del lado del almacenamiento, descrito en las notas sobre el almacenamiento de celdas por bloques de filas y las superposiciones de estilos por intervalo, y del lado del análisis en el análisis paralelo de XLSX y el asignador de memoria. Cuando la tarea es un puro escaneo sin ninguna edición, el lector directo en flujo omite el modelo de objetos por completo y superará 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, así que un trabajo de descubrimiento del lado del servidor corre 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 soportados y las licencias