PHP导出Excel为空主要是未写入数据或未正确设置表头;必须先用setCellValue()等方法显式写入第1行表头,再从第2行开始写数据,且需避免输出干扰和空数组问题。

PHP导出Excel为空,大概率是没写入数据或没正确设置表头。加表头不是“可选操作”,而是触发Excel生成的关键步骤——很多库(如 PhpSpreadsheet、PHPExcel)必须先定义列名(即表头),再追加行数据,否则生成的文件可能空白或报错。
确认你用的是哪个库
不同库加表头的方式差别很大,常见两种:
-
PhpSpreadsheet(推荐,PHPExcel 的继任者):需手动创建第一行,用
setCellValue()或fromArray() -
第三方轻量方案(如 spout):表头必须通过
addRow()显式写入,且必须在写入数据前调用
PhpSpreadsheet 加表头的最小可用代码
以下代码能导出带表头的 Excel,且不会为空:
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// ✅ 关键:先写表头(第1行)
$headers = ['姓名', '邮箱', '注册时间'];
$column = 'A';
foreach ($headers as $header) {
$sheet->setCellValue($column . '1', $header);
$column++;
}
// ✅ 再写数据(从第2行开始)
$data = [
['张三', 'zhang@example.com', '2024-05-01'],
['李四', 'li@example.com', '2024-05-02'],
];
$row = 2;
foreach ($data as $rowData) {
$col = 'A';
foreach ($rowData as $cell) {
$sheet->setCellValue($col . $row, $cell);
$col++;
}
$row++;
}
// 导出
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="users.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
常见导致“空Excel”的坑
- 忘了调用
$sheet->setCellValue('A1', '标题'),或表头写在了第0行(Excel 行号从1开始) - 数据数组为空,但没做判空处理,导致只写了表头没写内容——看起来像“空”,其实是只有表头
- 输出前有
echo、var_dump或多余空格,破坏了 Excel 二进制流 - 使用
fromArray()时,把表头和数据混在一个二维数组里,却没设置$strictNulls = false或没跳过首行
快速验证是否真为空
临时把导出改成保存到服务器本地:
立即学习“PHP免费学习笔记(深入)”;
$writer->save('/tmp/test.xlsx'); // 而不是 php://output
echo "已保存到 /tmp/test.xlsx,请检查内容";
这样能排除浏览器/响应头干扰,直接看文件是否真有内容。



















