Para exportar uma planilha do Excel para PDF a partir do Delphi ou C++Builder sem o Office instalado, chame o SaveAsPDF em uma planilha ou pasta de trabalho do HotXLS. O HotXLS é um componente Excel VCL nativo, e sua exportação de planilha para PDF renderiza o intervalo usado (used range) da planilha em um arquivo PDF 1.4 independente, mapeando as larguras das colunas do Excel e o texto de exibição das células em páginas A4 com paginação automática de várias páginas. Nenhuma cópia do Excel, driver de impressora ou DLL externa participa da renderização
O HotXLS trata o PDF como um formato de apresentação de dados, um irmão de seus caminhos de exportação de CSV, TSV e HTML em vez de um motor de renderização pixel a pixel. A exportação reproduz o conteúdo e o layout tabular: os valores exibidos na grade, as proporções das colunas e as linhas de grade ao redor das células. Essa abordagem é importante porque estabelece uma expectativa honesta desde o início, e o restante deste artigo trata exatamente de onde essa linha é traçada
Como converter Excel para PDF no Delphi sem Office?
O caminho mais curto é uma única chamada. O TXLSWorksheet expõe o SaveAsPDF(FileName) e o SaveAsPDF(Stream), e o TXLSWorkbook expõe as mesmas duas sobrecargas que encaminham para a planilha ativa. Cada uma retorna um Integer, 1 para sucesso e -1 para falha, permitindo que você ramifique com base no resultado sem precisar encapsular a chamada em um tratamento de exceções próprio
uses
lxHandle;
var
Book: TXLSWorkbook;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('sales-june.xlsx');
// Renderiza o intervalo usado da planilha ativa diretamente no report.pdf.
if Book.SaveAsPDF('report.pdf') = 1 then
Writeln('PDF gravado');
finally
Book.Free;
end;
end;
Quando você chama o SaveAsPDF em uma planilha, o HotXLS exporta o UsedRange dessa planilha, que é a caixa delimitadora de cada célula preenchida. A sobrecarga da pasta de trabalho é uma conveniência que delega para a planilha ativa, de modo que um relatório com várias planilhas varre as planilhas necessárias em um loop ou seleciona a planilha ativa antes da chamada. Não existe um modo de pasta de trabalho inteira e de passagem única que concatene todas as abas: cada chamada renderiza uma planilha ou um intervalo
Como o HotXLS transforma um intervalo usado em páginas PDF?
O HotXLS percorre o intervalo usado célula a célula e o dispõe como uma grade paginada. A geometria das colunas vem diretamente do Excel: a largura de cada coluna é convertida da unidade de largura do Excel para pontos tipográficos, com um limite mínimo para que nenhuma coluna se reduza a uma linha fina. Quando as colunas juntas são mais largas do que a página utilizável, o HotXLS as reduz uniformemente para caber; quando já cabem, ele as deixa em sua largura natural em vez de esticá-las ao longo da folha
As linhas fluem pela página até que a próxima cruze a margem inferior, momento em que o HotXLS abre uma página limpa e continua, de modo que uma planilha de mil linhas se pagina sozinha sem que você precise gerenciar as quebras de página. Cada célula imprime seu FormattedText, que é a string de exibição produzida após a aplicação da formatação numérica, assim, uma data é exibida como a planilha mostra e uma célula de moeda mantém seus separadores de milhar e símbolo. O texto que ultrapassa sua coluna é recortado na largura da célula em vez de invadir a célula vizinha
Controlando a orientação, as margens e o tamanho da fonte
Para qualquer coisa além do layout padrão, controle o exportador diretamente. O TXLSPDFExport é a classe por trás dos auxiliares de linha única e publica três propriedades: Orientation (xlsPdfPortrait ou xlsPdfLandscape, retrato por padrão), Margin (pontos, padrão 40) e FontSize (pontos, padrão 9). Defina-as antes de chamar o SaveAsPDF e todo o documento as adotará
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; // ajusta planilhas largas à página
Exporter.Margin := 28; // margem de página mais estreita, em pontos
Exporter.FontSize := 8; // linhas mais densas
Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
O TXLSPDFExport também aceita um intervalo em vez de uma planilha inteira por meio de SaveAsPDF(Range: IXLSRange; ...), que é a forma de exportar um bloco de resumo de uma planilha que também contém cálculos de rascunho. Essa sobrecarga de intervalo é a mesma usada internamente pelo auxiliar de planilha, de modo que o layout, a escala e a paginação se comportam de maneira idêntica, quer você forneça um intervalo usado completo ou uma seleção escolhida manualmente
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
Summary: IXLSRange;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('quarter.xlsx');
// Exporta apenas o bloco de resumo, ignorando as colunas de rascunho ao lado.
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 que o HotXLS não incorpora fonte: a compensação de Helvetica e WinAnsi
O HotXLS escreve o texto com a fonte Helvetica integrada do PDF e a codificação WinAnsiEncoding, uma escolha deliberada de zero dependência com um limite real. Como a Helvetica é uma das 14 fontes padrão que todo leitor de PDF compatível já carrega, o exportador não incorpora nenhum programa de fonte: o arquivo permanece pequeno e abre em qualquer lugar, sem necessidade de licenciar ou enviar nada junto. O custo dessa escolha é o repertório de caracteres que a página pode exibir
A codificação WinAnsiEncoding cobre o conjunto Windows-1252, portanto, textos em latim, pontuações comuns e os acentos usuais da Europa Ocidental são renderizados corretamente, e o HotXLS converte alguns caracteres tipográficos, aspas curvas, travessões, e o sinal do euro em seus respectivos slots do CP1252. Caracteres fora desse intervalo, como ideogramas CJK, cirílico, grego e árabe, se reduzem a um ponto de interrogação na página. Se as suas planilhas contiverem texto não latim, este exportador é a ferramenta errada, e um renderizador PDF de estilização completa é o trabalho que se adequa
Onde a exportação de planilha para PDF para
O HotXLS renderiza o conteúdo e o estrutura, não o estilo visual completo da planilha. Preenchimentos de célula, estilos de borda por borda, fontes e cores por célula, gráficos e imagens incorporadas ficam fora do que o exportador desenha; o que você obtém é a grade de texto com linhas de grade uniformes. Esse é o mesmo contrato respeitado pelos exportadores HTML e RTF, e é o correto para um relatório ou uma entrega de dados onde os números carregam o significado e o tema gráfico não importa
Quando o objetivo é um documento estilizado e consistente com a marca, o padrão usual é reunir os números primeiro em um modelo de planilha, o que o fluxo de trabalho de geração de relatórios orientado a modelos cobre detalhadamente. E como nada disso envolve COM ou uma instância do Excel em execução, o pipeline se encaixa no mesmo modelo de automação sem Office que o HotXLS usa em toda parte: Pascal puro, implantável em um servidor headless, sem interoperação para licenciar ou monitorar
O PDF independente, byte por byte
O HotXLS constrói a estrutura do arquivo PDF manualmente e calcula sua tabela de referência cruzada a partir de offsets de bytes exatos, que é o motivo pelo qual a saída abre em qualquer leitor. Ao serializar cada objeto, o HotXLS registra o offset inicial desse objeto antes de anexar seus bytes, e avança a posição corrente pelo tamanho do que acabou de gravar, assim, a tabela xref se posiciona precisamente sobre cada objeto e o startxref marca onde essa tabela começa. Um leitor que encontrar esses offsets com apenas um byte de diferença rejeitará o arquivo inteiro, tornando o offset autocalculado o contrato estrutural da exportação
Esse contrato traz uma consequência estrita que vale a pena conhecer. O nó Pages é escrito primeiro como objeto 1, mas sua lista de páginas filhas não é conhecida até que cada página tenha sido emitida; portanto, o HotXLS o reserva como um espaço reservado e insere as páginas e a contagem finais antes que a passagem de offset seja executada, nunca depois. Uma vez que os bytes de um objeto são medidos para a tabela xref, eles são congelados: alterar um único byte posteriormente deslocaria cada offset subsequente e corromperia a tabela. É uma disciplina simples que garante um PDF 1.4 padrão sem nenhuma biblioteca subjacente
Os métodos SaveAsPDF e a classe TXLSPDFExport mostrados aqui são fornecidos com o Componente HotXLS para Delphi, ao lado dos exportadores de CSV, HTML e RTF e da API completa de planilha para Delphi e C++Builder