PHP 导出 Excel 的三种常用方法

本文详细讲解 PHP 导出 Excel 文件的三种方法:原生生成CSV适用于简单数据快速导出,需注意中文编码(添加 BOM 头;HTML 表格伪装 Excel快速生成基础表格,但兼容性差,不支持复杂样式;PhpSpreadsheet 库(推荐)支持复杂格式(合并单元格、公式、样式定制),可导出 .xlsx 或 .xls,并解决大数据量内存问题。

PHP 导出 Excel 的三种常用方法

以下是使用 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;
?>

注意事项

  1. CSV 本质是纯文本,不支持单元格样式或公式。
  2. 中文乱码问题:确保文件编码为 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;
?>

核心功能扩展

  1. 合并单元格
    $sheet->mergeCells('A1:D1');
    $sheet->setCellValue('A1', '用户列表');
  2. 设置单元格格式(日期、货币):
    $sheet->setCellValue('D2', '2023-10-01');
    $sheet->getStyle('D2')->getNumberFormat()->setFormatCode('yyyy-mm-dd');
  3. 添加公式
    $sheet->setCellValue('E2', '=SUM(A2:A10)');
  4. 导出为 PDF
    use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
    $writer = new Mpdf($spreadsheet);
    $writer->save('php://output');

常见问题解决

  1. 中文乱码

    • 确保文件编码为 UTF-8
    • 在输出前添加 BOM 头(仅限 CSV):
      echo "\xEF\xBB\xBF";
  2. 内存不足(处理大数据量):

    • 分批次读取数据库数据。
    • 使用 Chunk 处理:
      $query->chunk(1000, function ($users) use ($sheet, &$row) {
          foreach ($users as $user) {
              $sheet->setCellValue('A' . $row, $user->id);
              $row++;
          }
      });
  3. 兼容性问题

    • 导出为 .xls 格式(Excel 2003):
      $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);

总结

  • 简单数据快速导出:使用 CSV 方法。
  • 复杂格式需求:使用 PhpSpreadsheet 库。
  • 避免内存溢出:分批次处理数据,及时释放内存。

通过上述方法,可灵活实现 PHP 导出 Excel 的功能,满足不同场景需求。

上一篇:阿里开源数据同步组件Canal 下一篇:PHP中使用cURL实现Get和Post请求的方法

评论

评论(1)

暂无评论