PHP生成Excel必须用PhpSpreadsheet等库,不可手动写.xlsx;导出需设正确响应头、写php://output并处理中文编码;CSV可用fputcsv+UTF-8 BOM实现轻量导出。

PHP 本身不内置 Excel 文件生成能力,直接用 fopen() 写 .xlsx 是不可行的——那只是二进制 ZIP 容器,手动拼装极易出错、无法兼容 Excel 软件。必须依赖成熟库。
用 PhpSpreadsheet 生成 Excel(推荐)
这是目前最主流、维护活跃、支持 .xlsx/.xls/.csv 的 PHP 库,取代了已停止维护的 PHPExcel。
- 通过 Composer 安装:
composer require phpoffice/phpspreadsheet - 导出前需设置响应头,否则浏览器不会触发下载:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');和header('Content-Disposition: attachment;filename="data.xlsx"'); - 写入后必须调用
$writer->save('php://output'),不能写到磁盘再读取,否则中文可能乱码或报错 - 若数据含中文,单元格样式需显式设字体:
$sheet->getStyle('A1')->getFont()->setName('SimSun')(Windows)或'Noto Sans CJK SC'(Linux/macOS)
用 fputcsv() 导出 CSV(轻量替代方案)
当只需兼容 Excel 打开、无公式/样式/多 sheet 需求时,CSV 更快更安全,且完全避免编码和格式问题。
- 打开输出流:
$fp = fopen('php://output', 'w'); - 写 BOM 头防 Excel 中文乱码(Windows 系统必需):
fputs($fp, "\xEF\xBB\xBF"); - 逐行写入:
fputcsv($fp, ['姓名', '邮箱', '注册时间'], ',', '"'); - 关闭前必须清空缓冲:
fclose($fp);,否则部分内容可能丢失 - 注意:CSV 不支持单元格合并、颜色、数字格式(如金额自动加千分位),Excel 打开时也可能误判数字列类型
常见错误:中文乱码、文件损坏、下载失败
这三个问题占导出失败的 90% 以上,根源几乎都出在输出控制上。
立即学习“PHP免费学习笔记(深入)”;
- 脚本开头有
echo、var_dump或空白字符(包括 UTF-8 BOM),会导致 header 发送失败 → 出现“Headers already sent”错误或 Excel 打开提示“文件已损坏” - 使用
exit或die在save('php://output')后立即终止,是安全的;但若前面已有输出,ob_end_clean()未必能挽回 - Apache + mod_php 下,
output_buffering开启时行为更隐蔽;CLI 模式下无法触发浏览器下载,仅适合生成文件到磁盘 - 不要用
file_put_contents('xxx.xlsx', $content)拼接 XML 字符串——XML 命名空间、关系定义、共享字符串表等极易出错,且无法验证有效性
真正麻烦的不是“怎么写几行代码”,而是确保输出流干净、编码一致、响应头精准匹配 MIME 类型。一旦涉及样式、公式、图表或大文件(>5MB),务必用 PhpSpreadsheet 并启用内存缓存(MemoryCache)或分块写入,否则 PHP 内存溢出比 Excel 打不开更难排查。










