
以下是使用 PHP 导出 Excel 文件的详细步骤教程,涵盖原生 PHP 实现和常用第三方库两种方式,并提供完整代码示例。
方法 1:原生 PHP 生成 CSV(简单快速)
适用场景:数据量小,无需复杂格式。
<?php
// 1. 设置 HTTP 头,声明文件类型
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="data.csv"');
// 2. 打开输出流(直接输出到浏览器)
$output = fopen('php://output', 'w');
// 3. 添加 CSV 标题行
fputcsv($output, ['ID', '姓名', '邮箱', '注册时间']);
// 4. 模拟数据(实际应从数据库获取)
$data = [
[1, '张三', 'zhangsan@example.com', '2023-01-01'],
[2, '李四', 'lisi@example.com', '2023-02-15'],
];
// 5. 写入数据行
foreach ($data as $row) {
fputcsv($output, $row);
}
// 6. 关闭流
fclose($output);
exit;
?>注意事项:
- CSV 本质是纯文本,不支持单元格样式或公式。
- 中文乱码问题:确保文件编码为
UTF-8,并添加BOM头(可选):echo "\xEF\xBB\xBF"; // 输出 BOM 头
方法 2:使用 PHP 原生生成 HTML 表格(伪装为 Excel)
适用场景:快速生成简单表格,兼容性较差。
<?php
// 1. 设置 HTTP 头(伪装为 Excel 文件)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="data.xls"');
// 2. 输出 HTML 表格
echo '<table border="1">';
echo '<tr><th>ID</th><th>姓名</th><th>邮箱</th></tr>';
echo '<tr><td>1</td><td>张三</td><td>zhangsan@example.com</td></tr>';
echo '<tr><td>2</td><td>李四</td><td>lisi@example.com</td></tr>';
echo '</table>';
exit;
?>缺点:
- 无法设置复杂样式。
- 部分 Excel 版本可能提示格式错误。
方法 3:使用 PhpSpreadsheet 库(推荐,功能强大)
适用场景:需要生成复杂格式的 .xlsx 或 .xls 文件。
步骤 1:安装 PhpSpreadsheet
通过 Composer 安装:
composer require phpoffice/phpspreadsheet步骤 2:完整代码示例
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 1. 创建 Spreadsheet 对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 2. 设置标题行
$sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('B1', '姓名');
$sheet->setCellValue('C1', '邮箱');
// 3. 填充数据(模拟数据,实际应从数据库获取)
$data = [
[1, '张三', 'zhangsan@example.com'],
[2, '李四', 'lisi@example.com'],
];
$row = 2; // 从第二行开始
foreach ($data as $item) {
$sheet->setCellValue('A' . $row, $item[0]);
$sheet->setCellValue('B' . $row, $item[1]);
$sheet->setCellValue('C' . $row, $item[2]);
$row++;
}
// 4. 设置样式(可选)
$sheet->getStyle('A1:C1')->applyFromArray([
'font' => [
'bold' => true,
'color' => ['rgb' => 'FFFFFF']
],
'fill' => [
'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
'startColor' => ['rgb' => '4CAF50']
]
]);
// 5. 自动调整列宽
foreach (range('A', 'C') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// 6. 输出到浏览器
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="users.xlsx"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
?>核心功能扩展:
- 合并单元格:
$sheet->mergeCells('A1:D1'); $sheet->setCellValue('A1', '用户列表'); - 设置单元格格式(日期、货币):
$sheet->setCellValue('D2', '2023-10-01'); $sheet->getStyle('D2')->getNumberFormat()->setFormatCode('yyyy-mm-dd'); - 添加公式:
$sheet->setCellValue('E2', '=SUM(A2:A10)'); - 导出为 PDF:
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf; $writer = new Mpdf($spreadsheet); $writer->save('php://output');
常见问题解决
中文乱码:
- 确保文件编码为
UTF-8。 - 在输出前添加 BOM 头(仅限 CSV):
echo "\xEF\xBB\xBF";
- 确保文件编码为
内存不足(处理大数据量):
- 分批次读取数据库数据。
- 使用
Chunk处理:$query->chunk(1000, function ($users) use ($sheet, &$row) { foreach ($users as $user) { $sheet->setCellValue('A' . $row, $user->id); $row++; } });
兼容性问题:
- 导出为
.xls格式(Excel 2003):$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);
- 导出为
总结
- 简单数据快速导出:使用 CSV 方法。
- 复杂格式需求:使用 PhpSpreadsheet 库。
- 避免内存溢出:分批次处理数据,及时释放内存。
通过上述方法,可灵活实现 PHP 导出 Excel 的功能,满足不同场景需求。
评论
暂无评论
评论(1)