使用phpSpreadsheet可高效导出PHP数据为excel文件,支持XLSX、csv等格式,通过composer安装后,初始化工作簿并写入数据即可生成报表。

在Web开发中,将PHP数据导出为Excel文件是一个常见需求,比如用于报表生成、数据备份或提供下载功能。实现这一目标有多种方式,下面介绍几种实用且高效的方案。
使用PHPExcel(现为PhpSpreadsheet)
PhpSpreadsheet 是 PHPExcel 的继任者,功能强大,支持读写多种电子表格格式,包括 XLSX、CSV、ODS 等。
安装方法:推荐使用 Composer 安装
composer require phpoffice/phpspreadsheet
基本用法示例:
立即学习“PHP免费学习笔记(深入)”;
require ‘vendor/autoload.php’;
use PhpofficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;
// 创建一个新的工作簿
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 添加表头
$sheet->setCellValue(‘A1’, ‘姓名’);
$sheet->setCellValue(‘B1’, ‘年龄’);
$sheet->setCellValue(‘C1’, ‘邮箱’);
// 模拟数据
$data = [
[‘张三’, 28, ‘zhangsan@example.com’],
[‘李四’, 32, ‘lisi@example.com’],
[‘王五’, 25, ‘wangwu@example.com’]
];
// 填充数据
$rowIndex = 2;
foreach ($data as $row) {
$sheet->setCellValue(‘A’ . $rowIndex, $row[0]);
$sheet->setCellValue(‘B’ . $rowIndex, $row[1]);
$sheet->setCellValue(‘C’ . $rowIndex, $row[2]);
$rowIndex++;
}
// 输出文件
header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
header(‘Content-Disposition: attachment;filename=”export.xlsx”‘);
header(‘Cache-Control: max-age=0’);
$writer = new Xlsx($spreadsheet);
$writer->save(‘php://output’);
?>
导出为CSV格式(轻量级方案)
如果不需要复杂样式,CSV 是最简单高效的选择,适合大数据量导出。
优点:速度快、内存占用低、兼容性好
// 数据
$data = [
[‘姓名’, ‘年龄’, ‘邮箱’],
[‘张三’, 28, ‘zhangsan@example.com’],
[‘李四’, 32, ‘lisi@example.com’]
];
// 设置响应头
header(‘Content-Type: text/csv; charset=utf-8′);
header(‘Content-Disposition: attachment; filename=data.csv’);
// 打开输出流
$output = fopen(‘php://output’, ‘w’);
// 设置 UTF-8 BOM 避免乱码(尤其 Excel 中文问题)
fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 写入数据
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
?>
处理数据库查询结果导出
从 MySQL 查询结果直接导出,适用于动态报表场景。
// 示例:PDO 查询用户数据
$pdo = new PDO(“mysql:host=localhost;dbname=test”, $user, $pass);
$stmt = $pdo->query(“SELECT name, age, email FROM users”);
header(‘Content-Type: text/csv’);
header(‘Content-Disposition: attachment; filename=users.csv’);
$output = fopen(‘php://output’, ‘w’);
fputcsv($output, [‘姓名’, ‘年龄’, ‘邮箱’]); // 表头
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
fputcsv($output, $row);
}
fclose($output);
?>
注意事项与优化建议
实际应用中需注意以下几点:
- 大数据量时避免使用 PhpSpreadsheet 加载全部数据到内存,可考虑分批导出或改用 CSV
- 中文导出乱码问题:CSV 文件应添加 UTF-8 BOM 头,XLSX 正确设置字符集
- 设置合适的超时时间:
set_time_limit(300) - 导出前清空缓冲区:
ob_clean()防止额外输出破坏文件结构 - 安全提示:对用户可控的导出参数做校验,防止任意文件下载漏洞
基本上就这些。根据项目需求选择合适的方式:需要格式化样式选 PhpSpreadsheet,追求性能和简洁用 CSV。两者都能很好地满足日常开发中的数据导出需求。不复杂但容易忽略细节,尤其是编码和输出控制。


