PHP实现Excel到PDF转换:完整指南与最佳实践

PHP实现Excel到PDF转换:完整指南与最佳实践

在现代Web应用中,经常需要将数据报表或电子表格以PDF格式导出,以便于存档、打印或分发。PHP作为一种流行的服务器端语言,提供了多种将Excel文件转换为PDF的解决方案。本文将深入探讨几种主流方法,并给出具体实现代码。

1. 为什么需要将Excel转为PDF?

  • 格式保真度:PDF能确保在不同设备上显示一致。
  • 安全性:可以添加密码保护或数字签名。
  • 打印优化:PDF是打印行业的标准格式。

2. 常用PHP库概览

转换过程通常分为两步:首先读取Excel文件,然后将内容渲染为PDF。以下是关键库:

功能特点
PhpSpreadsheet读写ExcelPHPExcel的继任者,维护活跃,支持多种格式。
DOMPDFHTML转PDF纯PHP实现,无需外部依赖,但对CSS支持有限。
TCPDFPDF生成功能强大,支持Unicode和复杂布局。
mPDFHTML转PDF基于HTML/CSS,对表格支持较好。

3. 方法一:使用PhpSpreadsheet + DOMPDF

这是轻量级且常见的组合。首先安装依赖:

composer require phpoffice/phpspreadsheet dompdf/dompdf

下面是转换示例代码:

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use Dompdf\Dompdf;

// 加载Excel文件
$spreadsheet = IOFactory::load('input.xlsx');
$sheet = $spreadsheet->getActiveSheet();

// 将Excel数据转为HTML表格
$html = '<table border="1">';
foreach ($sheet->getRowIterator() as $row) {
    $html .= '<tr>';
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(false);
    foreach ($cellIterator as $cell) {
        $value = $cell->getValue();
        $html .= '<td>' . htmlspecialchars($value ?? '') . '</td>';
    }
    $html .= '</tr>';
}
$html .= '</table>';

// 使用DOMPDF生成PDF
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();

// 输出到浏览器或保存文件
$dompdf->stream('output.pdf');
// 或 $output = $dompdf->output(); file_put_contents('output.pdf', $output);
?>

4. 方法二:使用PhpSpreadsheet + TCPDF

TCPDF直接支持从数组生成PDF,代码更简洁:

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use TCPDF;

$spreadsheet = IOFactory::load('input.xlsx');
$data = $spreadsheet->getActiveSheet()->toArray();

$pdf = new TCPDF();
$pdf->AddPage();
$pdf->SetFont('helvetica', '', 10);

// 将二维数组输出为PDF表格
foreach ($data as $row) {
    $pdf->Cell(0, 10, implode(' | ', $row), 1, 1);
}

$pdf->output('output.pdf');
?>

5. 方法三:使用mPDF(适合复杂样式)

mPDF在处理CSS样式方面更强大,适合保留Excel样式:

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use Mpdf\Mpdf;

$spreadsheet = IOFactory::load('input.xlsx');
$sheet = $spreadsheet->getActiveSheet();

// 构建带样式的HTML(简化示例)
$html = '<style>table {border-collapse: collapse;} td, th {border: 1px solid #000; padding: 5px;}</style>';
$html .= '<table>';
// ... 添加表格内容 ...
$html .= '</table>';

$mpdf = new Mpdf();
$mpdf->WriteHTML($html);
$mpdf->Output('output.pdf');
?>

6. 性能与优化建议

  • 内存管理:处理大文件时,使用流式读取或分块处理。
  • 缓存:对于重复转换,可以缓存生成的PDF。
  • 异步处理:使用队列(如Redis、RabbitMQ)处理耗时转换。

7. 总结

在PHP中实现Excel到PDF的转换,选择合适的库组合至关重要。对于简单需求,PhpSpreadsheet + DOMPDF是不错的起点;如果追求样式还原,可以考虑PhpSpreadsheet + mPDF。务必根据项目规模、性能要求和团队熟悉度进行选型。

提示:测试时注意处理特殊字符和编码问题,确保生成的PDF内容正确显示。