Para exportar uma folha de cálculo do Excel para PDF a partir do Delphi ou C++Builder sem o Office instalado, chame o SaveAsPDF numa folha de cálculo (worksheet) ou num livro de trabalho (workbook) do HotXLS. O HotXLS é um componente Excel VCL nativo, e a sua exportação de folha de cálculo para PDF renderiza o intervalo utilizado (used range) da folha num ficheiro PDF 1.4 autónomo, mapeando a largura das colunas do Excel e o texto de exibição das células para páginas A4 com paginação automática de múltiplas páginas. Nenhuma cópia do Excel, nenhum controlador de impressora (printer driver) e nenhuma DLL externa participam na renderização
O HotXLS trata o PDF como um formato de apresentação de dados, um irmão dos seus caminhos de exportação CSV, TSV e HTML, e não como um motor de renderização com precisão ao nível do píxel. A exportação reproduz o conteúdo e o layout tabulares: os valores que visualiza na grelha, as proporções das colunas e as linhas de grelha em torno das células. Esse enquadramento é importante porque define uma expectativa realista à partida, e o resto deste artigo descreve exatamente onde fica esse limite
Como converter o Excel para PDF no Delphi sem o 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 folha ativa. Cada uma devolve um Integer, 1 em caso de sucesso e -1 em caso de falha, para que possa ramificar o fluxo com base no resultado sem ter de envolver a chamada em tratamentos de exceção próprios
uses
lxHandle;
var
Book: TXLSWorkbook;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('sales-june.xlsx');
// Renderiza o intervalo utilizado da folha ativa diretamente para report.pdf.
if Book.SaveAsPDF('report.pdf') = 1 then
Writeln('PDF gravado');
finally
Book.Free;
end;
end;
Quando chama o SaveAsPDF numa folha de cálculo, o HotXLS exporta o UsedRange dessa folha, a caixa delimitadora (bounding box) de cada célula preenchida. A sobrecarga do livro de trabalho é uma conveniência que delega na folha ativa, pelo que um relatório com múltiplas folhas ou percorre as folhas de que necessita ou seleciona a folha ativa antes da chamada. Não existe um modo de passagem única para todo o livro de trabalho que concatene todos os separadores: cada chamada renderiza uma folha ou um intervalo
Como o HotXLS transforma um intervalo utilizado en páginas PDF?
O HotXLS percorre o intervalo utilizado célula a célula e organiza-o como uma grelha 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 encolha até desaparecer. Quando as colunas em conjunto são mais largas do que a página utilizável, o HotXLS reduz a escala de forma uniforme para caberem; quando já cabem, deixa-as na sua largura natural em vez de as esticar ao longo da folha
As linhas fluem então página abaixo até que a seguinte ultrapasse a margem inferior, ponto em que o HotXLS abre uma nova página e continua, pelo que uma folha de mil linhas se pagina sozinha sem qualquer gestão de quebras de página da sua parte. Cada célula imprime o seu FormattedText, a string de exibição produzida após a aplicação do formato numérico, pelo que uma data surge como a data que a folha mostra e uma célula de moeda mantém os seus separadores de milhares e símbolo. O texto que excede a sua coluna é truncado (clipped) para a largura da célula em vez de transbordar para a vizinha
Controlar a orientação, as margens e o tamanho da fonte
Para qualquer aspeto além do layout padrão, controle o exportador diretamente. A TXLSPDFExport é a classe por trás dos auxiliares de linha única, e publica três propriedades: Orientation (xlsPdfPortrait ou xlsPdfLandscape, por padrão retrato), Margin (pontos, padrão 40) e FontSize (pontos, padrão 9). Defina-as antes de chamar o SaveAsPDF e todo o documento irá adotá-las
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 folhas largas na 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 folha completa através de SaveAsPDF(Range: IXLSRange; ...), que é a forma de exportar um bloco de resumo de uma folha que também contém cálculos temporários (scratch). Essa sobrecarga de intervalo é a mesma em que o auxiliar da folha de cálculo se apoia internamente, pelo que o layout, escala e paginação se comportam de forma idêntica, quer lhe entregue um intervalo utilizado completo ou uma seleção escolhida à mão
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
Summary: IXLSRange;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('quarter.xlsx');
// Exporta apenas o bloco de resumo, não 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 fontes: a compensação de Helvetica e WinAnsi
O HotXLS grava o texto com a fonte Helvetica integrada do PDF e a codificação WinAnsiEncoding, uma escolha deliberada de dependência zero com um limite real. Como a Helvetica é uma das 14 fontes padrão que qualquer leitor de PDF compatível já contém, o exportador não incorpora nenhum programa de fonte: o ficheiro mantém-se pequeno e abre em qualquer lugar, sem necessidade de licenciamento ou de envio de componentes adicionais. O custo dessa escolha é o repertório de caracteres que a página pode exibir
A codificação WinAnsiEncoding cobre o conjunto Windows-1252, pelo que texto em latim, pontuação comum e os acentos normais da Europa Ocidental são renderizados corretamente, e o HotXLS integra alguns caracteres tipográficos, aspas curvas, travessões en e em, e o sinal do euro nas suas posições CP1252. Caracteres fora desse intervalo, ideogramas CJK, cirílico, grego e árabe, colapsam num ponto de interrogação na página. Se as suas folhas contêm texto não latino, este exportador é a ferramenta errada, e um renderizador de PDF com estilização completa é a solução adequada
Onde termina a exportação de folha de cálculo para PDF
O HotXLS renderiza o conteúdo e a estrutura, não o estilo visual completo da folha. Os preenchimentos de células, estilos de contorno (border) por margem, fontes e cores por célula, gráficos e imagens incorporadas ficam de fora do que o exportador desenha; o que obtém é a grelha de texto com linhas de grelha uniformes. Esse é o mesmo contrato que os exportadores HTML e RTF respeitam, e é a opção certa para um relatório ou uma entrega de dados onde os números carregam o significado e o design visual não
Quando o objetivo é um documento estilizado e consistente com a marca, o padrão habitual é reunir primeiro os números num modelo de folha de cálculo, o que o fluxo de trabalho de geração de relatórios baseado em modelos cobre em detalhe. E como nada disto envolve COM ou uma instância do Excel em execução, o pipeline encaixa-se no mesmo modelo de automação sem Office que o HotXLS utiliza em geral: Pascal puro, implementável num servidor headless, sem interoperabilidade para licenciar ou monitorizar
O PDF autónomo, byte a byte
O HotXLS constrói a estrutura do ficheiro PDF à mão e calcula a sua tabela de referência cruzada a partir de offsets de bytes exatos, o que explica por que a saída se abre em qualquer leitor. À medida que serializa cada objeto, o HotXLS regista o offset inicial desse objeto antes de anexar os seus bytes, avançando depois a posição de execução pelo comprimento que acabou de escrever, para que a tabela xref aponte precisamente para cada objeto e o startxref marque onde essa tabela começa. Um leitor que detete esses offsets desalinhados por apenas um byte rejeita todo o ficheiro, tornando o offset autocalculado o contrato estrutural do exportador
Esse contrato traz uma consequência estrita que vale a pena conhecer. O nó Pages é gravado primeiro como objeto 1, mas a sua lista de páginas filhas só é conhecida depois de cada página ser emitida, pelo que o HotXLS reserva-o como um marcador de posição (placeholder) e insere os filhos e a contagem finais antes de a passagem de offsets ser executada, nunca depois. Uma vez medidos os bytes de um objeto para a xref, estes são congelados: alterar um único byte posteriormente deslocaria todos os offsets seguintes e corromperia a tabela. Trata-se de uma pequena disciplina que garante um PDF 1.4 em conformidade com as normas, sem qualquer biblioteca subjacente
Os métodos SaveAsPDF e a classe TXLSPDFExport apresentados aqui são fornecidos com o HotXLS Delphi Excel Component, juntamente com os exportadores CSV, HTML e RTF e a API completa de folhas de cálculo (worksheet) para Delphi e C++Builder