如何用PHP生成PDF或Excel文件?

以下是使用PHP生成PDF和Excel文件的详细指南,涵盖常用库、实现方法、代码示例及常见问题解决方案:

一、生成PDF文件

1. 常用库及选择建议

根据资料,主流的PHP PDF生成库包括:

  • FPDF:轻量级,无需依赖,适合简单PDF生成,但需手动布局。
  • TCPDF:FPDF的扩展,支持HTML/CSS、UTF-8、自动分页,适合复杂文档。
  • Dompdf:基于HTML转PDF,支持CSS2.1和部分CSS3,适合已有HTML模板的场景。
  • mPDF:支持UTF-8和复杂排版,适合多语言和高级样式需求。
  • wkhtmltopdf:通过WebKit引擎渲染HTML生成PDF,支持JavaScript,但需命令行调用。

选择建议

  • 简单需求:FPDF。
  • 复杂布局:TCPDF或mPDF。
  • HTML转PDF:Dompdf或wkhtmltopdf。
2. 安装方法
  • FPDF:从官网下载fpdf.php并引入项目。
  • TCPDF/Dompdf/mPDF:通过Composer安装:
composer require tecnickcom/tcpdf   # TCPDF
composer require dompdf/dompdf     # Dompdf
composer require mpdf/mpdf         # mPDF
3. FPDF基础示例
<?php
require('fpdf.php');

class PDF extends FPDF {
    function Header() {
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 10, 'PDF Header', 0, 1, 'C');
    }
}

$pdf = new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial', '', 12);
$pdf->Cell(0, 10, 'Hello World!', 0, 1);
$pdf->Output('D', 'example.pdf');  // 'D'表示直接下载
?>

此示例创建带页眉的PDF。

4. 常见问题及解决

中文乱码:使用支持中文的字体(如stsongstdlight),并设置UTF-8编码:

$pdf->AddFont('stsongstdlight', '', 'stsongstdlight.php');
$pdf->SetFont('stsongstdlight', '', 12);
  • 性能优化:分页生成、缓存重复元素,避免一次性加载大量数据。

二、生成Excel文件

1. 常用库及选择建议

根据资料,主流库包括:

  • PHPExcel:已停止维护,建议迁移到PhpSpreadsheet。
  • PhpSpreadsheet:PHPExcel的现代替代品,支持XLSX、ODS等格式,功能丰富。
  • 原生CSV输出:简单快速,但无法设置复杂格式。

选择建议

  • 新项目:PhpSpreadsheet。
  • 旧项目维护:PHPExcel(需注意兼容性)。
2. PhpSpreadsheet安装

通过Composer安装:

composer require phpoffice/phpspreadsheet
3. PhpSpreadsheet基础示例
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// 设置表头和数据
$sheet->setCellValue('A1', '姓名');
$sheet->setCellValue('B1', '年龄');
$sheet->setCellValue('A2', '张三');
$sheet->setCellValue('B2', 25);

// 设置样式
$sheet->getStyle('A1:B1')->getFont()->setBold(true);

// 输出为Excel文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="example.xlsx"');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');

此示例生成带加粗表头的Excel文件。

4. 常见问题及解决

内存溢出:分块处理数据,或使用缓存:

$writer = new Xlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);  // 禁用公式预计算
  • 兼容性问题:确保输出格式(如XLSX)与目标Excel版本匹配。

  • 中文乱码:设置单元格编码为UTF-8,或使用mb_convert_encoding转换数据。

三、对比与总结

PDF库对比
特性 FPDF TCPDF Dompdf mPDF
HTML支持 部分
UTF-8支持 需手动配置
中文兼容性 需额外字体 内置支持 需配置字体 内置支持
适用场景 简单文档 复杂布局 HTML模板 多语言文档
Excel库对比
特性 PHPExcel PhpSpreadsheet 原生CSV
维护状态 已停止 活跃 -
功能丰富度 更高
内存消耗 优化后较低 极低
适用场景 旧项目维护 新项目 简单导出

四、推荐工具

  • PDF云服务:APITemplate.io或CraftMyPDF,适合无需本地部署的场景。
  • Excel云服务:结合Zapier等平台实现自动化。

通过合理选择库和优化代码,PHP可高效生成满足需求的PDF和Excel文件。