Artículo técnico

Exportar hojas de cálculo de Excel a PDF en Delphi sin Office

Para exportar una hoja de cálculo de Excel a PDF desde Delphi o C++Builder sin tener Office instalado, llame a SaveAsPDF en una hoja de cálculo o libro de trabajo de HotXLS. HotXLS es un componente nativo de Excel VCL, y su exportación de hoja de cálculo a PDF renderiza el rango utilizado de la hoja a un archivo PDF 1.4 independiente, asignando los anchos de columna de Excel y el texto de visualización de las celdas en páginas A4 con paginación automática de varias páginas. Ninguna copia de Excel, ningún controlador de impresora y ninguna DLL externa participan en el renderizado

HotXLS trata a PDF como un formato de presentación de datos, un hermano de sus rutas de exportación CSV, TSV e HTML en lugar de un motor de renderizado preciso a nivel de píxel. La exportación reproduce el contenido y el diseño tabular: los valores que ve en la cuadrícula, las proporciones de las columnas y las líneas de cuadrícula alrededor de las celdas. Ese enfoque es importante porque establece una expectativa honesta desde el principio, y el resto de este artículo trata exactamente sobre dónde se encuentra ese límite

¿Cómo convertir Excel a PDF en Delphi sin Office?

La ruta más corta es una sola llamada. TXLSWorksheet expone SaveAsPDF(FileName) y SaveAsPDF(Stream), y TXLSWorkbook expone las mismas dos sobrecargas que se reenvían a la hoja activa. Cada una devuelve un Integer, 1 en caso de éxito y -1 en caso de fallo, por lo que puede bifurcar según el resultado sin tener que envolver la llamada en su propio control de excepciones

uses
  lxHandle;

var
  Book: TXLSWorkbook;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('sales-june.xlsx');
    // Render the active sheet's used range straight to report.pdf.
    if Book.SaveAsPDF('report.pdf') = 1 then
      Writeln('PDF written');
  finally
    Book.Free;
  end;
end;

Cuando llama a SaveAsPDF en una hoja de cálculo, HotXLS exporta el UsedRange de esa hoja, que es el cuadro delimitador de cada celda ocupada. La sobrecarga del libro de trabajo es una conveniencia que delega en la hoja activa, por lo que un reporte de varias hojas requiere recorrer las hojas necesarias o seleccionar la hoja activa antes de la llamada. No existe un modo de libro completo que concatene cada pestaña en una sola pasada: cada llamada renderiza una hoja o un rango

¿Cómo convierte HotXLS un rango utilizado en páginas PDF?

HotXLS recorre el rango utilizado celda por celda y lo diseña como una cuadrícula paginada. La geometría de las columnas proviene directamente de Excel: el ancho de cada columna se convierte de la unidad de ancho de Excel a puntos tipográficos, con un límite mínimo para que ninguna columna se contraiga a un fragmento diminuto. Cuando las columnas juntas son más anchas que la página utilizable, HotXLS las reduce uniformemente para que quepan; cuando ya caben, las deja en su ancho natural en lugar de estirarlas a lo largo de la página

Las filas fluyen hacia abajo en la página hasta que la siguiente cruzaría el margen inferior, momento en el cual HotXLS abre una nueva página y continúa, de modo que una hoja de mil filas se pagina por sí sola sin que usted tenga que llevar un registro de los saltos de página. Cada celda imprime su FormattedText, que es la cadena de visualización producida después de aplicar el formato de número, por lo que una fecha se muestra como la fecha que muestra la hoja y una celda de moneda conserva su símbolo y sus separadores de miles. El texto que supera el límite de su columna se recorta al ancho de la celda en lugar de desbordarse a la vecina

Control de la orientación, los márgenes y el tamaño de la fuente

Para cualquier cosa que vaya más allá del diseño predeterminado, maneje el exportador directamente. TXLSPDFExport es la clase detrás de los asistentes de una sola línea, y publica tres propiedades: Orientation (xlsPdfPortrait o xlsPdfLandscape, vertical por defecto), Margin (puntos, por defecto 40) y FontSize (puntos, por defecto 9). Establézcalos antes de llamar a SaveAsPDF y todo el documento los asumirá

uses
  lxHandle, lxPDF;

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('wide-ledger.xlsx');
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.Orientation := xlsPdfLandscape;  // fit wide sheets on the page
      Exporter.Margin := 28;                     // tighter page margin, in points
      Exporter.FontSize := 8;                    // denser rows
      Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

TXLSPDFExport también acepta un rango en lugar de una hoja completa a través de SaveAsPDF(Range: IXLSRange; ...), que es cómo se exporta un bloque de resumen de una hoja que también contiene cálculos auxiliares. Esa sobrecarga de rango es la misma en la que se apoya internamente el asistente de la hoja de cálculo, por lo que el diseño, la escala y la paginación se comportan de manera idéntica tanto si se entrega un rango completo utilizado como una selección elegida a mano

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
  Summary: IXLSRange;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('quarter.xlsx');
    // Export only the summary block, not the scratch columns beside it.
    Summary := Book.Sheets[1].Range['A1', 'F20'];
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.SaveAsPDF(Summary, 'summary.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

Por qué HotXLS no incrusta ninguna fuente: el compromiso de Helvetica y WinAnsi

HotXLS escribe el texto con la fuente Helvetica integrada de PDF y la codificación WinAnsiEncoding, una elección deliberada de cero dependencias con un límite real. Debido a que Helvetica es una de las 14 fuentes estándar que ya incluye cada lector de PDF compatible, el exportador no incrusta ningún programa de fuentes en absoluto: el archivo se mantiene pequeño y se abre en cualquier lugar, sin necesidad de licencias ni de archivos adicionales para enviar. El costo de esa elección es el repertorio de caracteres que la página puede mostrar

WinAnsiEncoding cubre el conjunto Windows-1252, por lo que el texto en alfabeto latino, la puntuación común y las acentuaciones usuales de Europa occidental se renderizan correctamente, y HotXLS adapta un puñado de caracteres tipográficos, comillas tipográficas, guiones cortos y largos, y el signo del euro en sus posiciones CP1252. Los caracteres fuera de ese rango, ideogramas CJK, cirílico, griego y árabe, se reducen a un signo de interrogación en la página. Si sus hojas contienen texto no latino, este exportador es la herramienta incorrecta, y un renderizador de PDF con estilo completo es el trabajo adecuado

Dónde se detiene la exportación de hoja de cálculo a PDF

HotXLS renderiza el contenido y la estructura, no el estilo visual completo de la hoja. Los rellenos de celdas, los estilos de borde por lado, las fuentes y colores por celda, los gráficos y las imágenes incrustadas quedan fuera de lo que dibuja el exportador; lo que se obtiene es la cuadrícula de texto con líneas de cuadrícula uniformes. Ese es el mismo contrato que respetan los exportadores de HTML y RTF, y es el adecuado para un reporte o una transferencia de datos donde los números llevan el significado y el tema visual no lo hace

Cuando el objetivo es un documento con estilo y coherente con la marca, el patrón habitual es organizar primero los números en una plantilla de hoja de cálculo, lo que se cubre en detalle en el flujo de trabajo de generación de reportes basado en plantillas. And because none of this touches COM or a running Excel instance, the pipeline fits the same Office-free automation model HotXLS uses throughout: pure Pascal, deployable on a headless server, with no interop to license or babysit

El PDF independiente, byte por byte

HotXLS construye la estructura del archivo PDF a mano y calcula su tabla de referencias cruzadas a partir de desplazamientos de bytes exactos, que es la razón por la que la salida se abre en cada lector. A medida que serializa cada objeto, HotXLS registra el desplazamiento inicial de ese objeto antes de añadir sus bytes, luego avanza la posición de ejecución según la longitud que acaba de escribir, de modo que la tabla xref se ubica precisamente en cada objeto y startxref marca dónde comienza esa tabla. Un lector que encuentre esos desplazamientos desplazados incluso un solo byte rechaza todo el archivo, lo que convierte al desplazamiento autocalculado en el contrato principal del exportador

Ese contrato conlleva una consecuencia estricta que vale la pena conocer. El nodo Pages se escribe primero como el objeto 1, pero su lista de páginas secundarias no no se conoce hasta que se han emitido todas las páginas, por lo que HotXLS lo reserva como un marcador de posición y parchea los elementos secundarios y el recuento finales antes de que se ejecute el paso de desplazamiento, nunca después. Una vez medidos los bytes de un objeto para el xref, se congelan: cambiar un solo byte después desplazaría cada desplazamiento siguiente y corrompería la tabla. Es una pequeña disciplina que proporciona un PDF 1.4 válido según los estándares sin ninguna biblioteca subyacente

Los métodos SaveAsPDF y la clase TXLSPDFExport que se muestran aquí se incluyen con HotXLS Delphi Excel Component, junto con los exportadores de CSV, HTML y RTF y la API de hoja de cálculo completa para Delphi y C++Builder