Haga clic con el botón derecho en cualquier libro que entregue su aplicación, abra Propiedades y lea la pestaña Detalles. Si el Título dice "Plantilla Q1 — NO USAR" y el Autor es un analista que dejó la empresa en 2019, su generador ha estado copiando metadatos de la plantilla en cada entrega al cliente. Nadie lo ve en la cuadrícula de Excel, pero Windows Search lo indexa, SharePoint lo muestra como título del documento y un sistema de gestión de registros archivará sin problema cuatro mil estados bajo el autor equivocado. Los errores de metadatos son invisibles al crear el archivo y vergonzosos cuando se descubren.
HotXLS expone las propiedades de documento como propiedades simples a nivel de libro en ambos motores, la fachada BIFF para .xls y la fachada OOXML para .xlsx, así que corregir esta clase de error consiste sobre todo en saber qué campos existen, dónde viven físicamente y cuál es el comportamiento de activación que decide si se escriben.
Dónde almacena realmente Excel las propiedades de documento
Los dos formatos de archivo guardan los metadatos en lugares totalmente distintos; por eso una biblioteca necesita dos implementaciones y por eso las herramientas a medio terminar suelen sellar bien un formato e ignorar el otro. Un libro BIFF guarda sus propiedades en flujos de archivo compuesto OLE, el conjunto clásico SummaryInformation que precede al propio Excel, además del registro en el flujo WRITEACCESS que registra quién guardó por última vez el archivo. Un libro OOXML las guarda como partes XML dentro del paquete zip: docProps/core.xml lleva los campos Dublin Core, título, creador, asunto, palabras clave y fechas, y docProps/app.xml lleva campos de nivel aplicación como empresa y aplicación generadora, según ECMA-376 Parte 1.
HotXLS aplana ambos almacenamientos en propiedades directas del objeto libro. Usted nunca toca un flujo de conjunto de propiedades ni una parte XML; asigna cadenas y fechas, y se produce el contenedor correcto para el formato que se guarda.
Sellar libros generados desde el registro de negocio
En el lado XLSX, TXLSXWorkbook expone Title, Subject, Author, Keywords, Description, Category, LastModifiedBy, Company, Application y AppVersion como cadenas, además de Created y Modified como valores TDateTime donde cero significa sin establecer. La regla de generación que evita el error del primer párrafo es simple: asigne todos los campos en cada ejecución, tomando los valores del registro de negocio en vez de confiar en lo que traía la plantilla.
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open('statement-template.xlsx') <> 1 then
raise Exception.Create('Template not available');
// Overwrite every field: anything left untouched is
// inherited from whoever designed the template.
Book.Title := 'Account Statement 2026-06 / ACME Corp';
Book.Subject := 'Monthly account statement';
Book.Author := 'Billing Service 4.2';
Book.LastModifiedBy := 'Billing Service 4.2';
Book.Company := 'Northwind Financial';
Book.Category := 'Customer Delivery';
Book.Keywords := 'statement;billing;2026-06;acct-10024';
Book.Description := 'Generated document - manual edits are not retained';
Book.Created := Now;
Book.Modified := Now;
Book.SaveAs('statement-10024.xlsx');
finally
Book.Free;
end;
end;
El campo Keywords merece más atención de la que suele recibir. La infraestructura de búsqueda, Windows Search, SharePoint y la mayoría de los productos DMS, lo indexa literalmente, así que una convención separada por punto y coma que lleve el número de cuenta y el periodo convierte cada libro entregado en un registro localizable sin ningún viaje a la base de datos. Mantenga los datos personales fuera de ese campo: las propiedades viajan con cada copia del archivo, mucho más allá de los controles de acceso del sistema que lo generó.
El par de marcas de tiempo tiene sus propias semánticas que conviene fijar por política. Created debe marcar el momento en que su canalización generó el documento y luego no cambiar nunca; Modified es el campo que Excel actualiza cada vez que un destinatario guarda el archivo, así que una diferencia entre ambos después de la entrega es evidencia positiva de que alguien editó el libro posteriormente, útil en disputas sobre de quién son los números de una hoja reenviada. Como el estado sin establecer es el valor literal cero y no una excepción ni un null, el código de auditoría debe comparar contra cero de forma explícita; de lo contrario, formatear un TDateTime sin establecer produce en sus logs una fecha de diciembre de 1899 con demasiada seguridad.
DocPropsTouched: el libro que se entrega sin docProps
El escritor de propiedades XLSX está gobernado por un indicador de solo lectura, DocPropsTouched. Un libro en el que nunca se asignó ninguna propiedad no produce partes docProps en absoluto; HotXLS evita deliberadamente escribir un esqueleto vacío de metadatos. Es un comportamiento ordenado, pero tiene dos consecuencias que conviene contemplar en ingeniería.
Primero, el código de recepción del lado consumidor no debe asumir que core.xml existe en todos los paquetes; las herramientas que lo exigen de forma estricta rechazarán archivos mínimos perfectamente válidos. Segundo, si su postura de cumplimiento requiere que todo documento saliente lleve al menos una identidad de generador, el requisito se traduce a código: asigne Application y Author incondicionalmente en la ruta de guardado, porque un libro intacto satisface la especificación del formato mientras falla su política en silencio.
La superficie XLS heredada y la trampa de Comments
La fachada BIFF lleva el conjunto de campos anterior y más pequeño: Title, Subject, Author, Keywords, Comments, Company y Manager, además de LastSavedBy, un alias de UserName, que escribe el registro WRITEACCESS que Excel muestra cuando otro usuario bloquea un archivo.
var
Legacy: IXLSWorkbook; // reference-counted interface: no manual Free
begin
Legacy := TXLSWorkbook.Create;
if Legacy.Open('archive-1999.xls') <= 0 then
raise Exception.Create('Cannot open archive file');
Legacy.Title := 'FY1999 ledger (migrated copy)';
Legacy.Author := 'Archive Migration Batch';
Legacy.Company := 'Northwind Financial';
Legacy.Comments := 'Migrated 2026-06-11; source retained in cold storage';
Legacy.LastSavedBy := 'migration-svc'; // BIFF WRITEACCESS record
Legacy.SaveAs('archive-1999-stamped.xls');
end;
Una colisión de nombres causa confusión con regularidad: la propiedad de nivel documento Comments aquí es la observación de texto libre que aparece en el cuadro de propiedades del archivo. No tiene nada que ver con los comentarios de celdas, que son objetos de la capa de dibujo adjuntos a rangos mediante una API completamente distinta. Las revisiones de código detectan con sorprendente frecuencia afirmaciones como "ya escribimos Comments" que terminan refiriéndose a la función equivocada: comparten un nombre y nada más.
Leer metadatos al recibir y la brecha del sondeo
La lectura es simétrica: después de Open, las mismas propiedades se pueblan desde el archivo, lo que convierte la auditoría de metadatos de libros entrantes en un bucle corto.
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open(FileName) = 1 then
begin
Writeln(Format('%s | title="%s" author="%s" created=%s',
[ExtractFileName(FileName), Book.Title, Book.Author,
FormatDateTime('yyyy-mm-dd', Book.Created)]));
if Book.Created = 0 then
Writeln(' no creation date recorded');
end;
finally
Book.Free;
end;
end;
Planifique una limitación: no hay sondeo solo de propiedades. GetSheetNames puede listar hojas sin cargar un libro, pero leer Title o Author requiere un Open completo, así que la clasificación por metadatos de un archivo histórico grande paga el costo total de análisis por archivo. En el lado BIFF, ese costo puede recortarse para auditorías de solo lectura estableciendo _DisableGraphics en true antes de abrir, lo que omite por completo el análisis de la capa de dibujo; es apropiado cuando el bucle solo lee propiedades y estadísticas de celdas, e inapropiado en el momento en que la misma instancia pudiera guardar, porque el contenido de dibujo omitido se perdería. Si la estructura de hojas por sí sola puede prefiltrar el conjunto, por ejemplo omitiendo exportaciones de una sola hoja, las técnicas económicas en nuestro artículo sobre listado de hojas e inspección ligera reducen cuántos archivos necesitan la pasada costosa. Para trabajos masivos de sellado donde se generan miles de salidas en vez de inspeccionarlas, los patrones de rendimiento del lado de escritura en nuestro artículo sobre escritura en streaming para trabajos por lotes aplican sin cambios, ya que la asignación de propiedades no añade nada medible al tiempo de guardado.
Preguntas frecuentes
¿Las propiedades de documento sobreviven a la conversión de formato?
Dentro de una misma fachada, sí: abra un XLSX, modifíquelo, guárdelo y el conjunto de propiedades hace el ciclo de ida y vuelta. Entre formatos, trate las propiedades como parte de su lista de conversión: los conjuntos de campos BIFF y OOXML no coinciden uno a uno, BIFF tiene Manager mientras OOXML tiene Category, Description y marcas de tiempo, así que un conversor debe mapear campos de forma explícita en vez de asumir paridad.
¿Los metadatos pueden filtrar información que no pretendía entregar?
Sí, y la herencia de plantillas es el principal vector: nombres de autores, etiquetas internas de proyecto en palabras clave, títulos de borrador. La defensa es la disciplina de sobrescribir todo mostrada arriba. Verifique con el mismo cuadro de Propiedades que sus clientes pueden abrir, o descomprimiendo un .xlsx y leyendo directamente docProps/core.xml.
¿Qué campos impulsan los resultados de búsqueda en SharePoint y Windows Search?
Title, Author, Keywords, expuesto como Tags, y Comments o Description llevan la mayor parte del peso de indexación. Un Title significativo por sí solo, distinto por documento y con el periodo y la cuenta, aporta más a la facilidad de búsqueda que cualquier convención de nombres de carpetas agregada encima.
Las propiedades de documento son el pulido profesional más barato que puede llevar un libro generado y el defecto que más se entrega cuando nadie se hace dueño de ellas. Ambas superficies de propiedades descritas aquí son parte de HotXLS Component, que las escribe de forma nativa para XLS y XLSX sin automatización de Excel.