phpspreadsheet导出excel报错“class not found”是因未通过composer安装或autoloader未生效;中文乱码需统一utf-8编码并设置中文字体;大数据量应禁用公式计算、用fromarray批量写入或换spout流式导出;xml非法字符须转义并清理输出缓冲。

PHP 8.5 中用 PhpSpreadsheet 导出 Excel 报错 Class "PhpOffice\PhpSpreadsheet\Spreadsheet" not found
这是最常卡住的第一步:类没自动加载。PHP 8.5 本身不提供 Excel 功能,PhpSpreadsheet 是独立库,必须通过 Composer 安装且确保 autoloader 生效。
- 确认已运行
composer require phpoffice/phpspreadsheet,且vendor/autoload.php在脚本开头被require(不是include) - 检查 PHP CLI 和 Web 服务器(如 Apache/Nginx)是否共用同一套
vendor目录;常见坑是 CLI 装了,但 PHP-FPM 没读到 - 如果用 Swoole 或 RoadRunner 等常驻进程,修改代码后需重启服务——类不会热重载
导出中文标题/内容乱码或变成方块
本质是字符编码没对齐:PhpSpreadsheet 内部用 UTF-8,但 Excel(尤其旧版)默认按系统 locale 解析。导出时没显式声明编码,Windows 客户端就容易崩。
- 写入前统一用
mb_convert_encoding($text, 'UTF-8', 'auto')清洗数据,避免 GBK/GB2312 混入 - 设置单元格字体:用
$cell->getStyle()->getFont()->setName('SimSun')(宋体)或'Microsoft YaHei',别依赖默认的 Calibri(不支持中文) - 导出为
Xlsx格式(非Xls),后者在 PHP 8.5 + 新版 PhpSpreadsheet 中已标记为 legacy,中文兼容更差
Memory limit exhausted 导出万行以上 Excel 崩溃
PhpSpreadsheet 默认把整张表加载进内存,1 万行 × 50 列 ≈ 200MB+,PHP 8.5 默认 memory_limit=128M 直接炸。
- 用
\PhpOffice\PhpSpreadsheet\Writer\Xlsx的setPreCalculateFormulas(false)关掉公式预计算 - 禁用单元格样式缓存:
$spreadsheet->getCellStyleXfCollection()不要反复调用;批量写入时用fromArray()替代逐 cell 赋值 - 真要导超大表?改用
Spout库——它流式写入,内存恒定在 3–5MB,但只支持 XLSX/CSV,无公式/图表
导出文件打开提示“发现不可读取的内容”
Excel 弹这个警告,90% 是 XML 结构非法:比如单元格里塞了未转义的 、<code>>、&,或者用了 \n 换行但没设 setWrapText(true)。
立即学习“PHP免费学习笔记(深入)”;
- 所有用户输入内容写入前过一遍
htmlspecialchars($value, ENT_QUOTES, 'UTF-8') - 含换行文本必须同时设置:
$cell->setValue("第一行\n第二行")->getStyle()->getAlignment()->setWrapText(true) - 导出前加一句
ob_end_clean(),确保没有意外输出(空格、BOM、warning)混进二进制流











