不能直接用phpexcel,因其最后稳定版1.8.2已停止维护,不兼容php 7.4+严格类型检查,常见方法签名冲突报错,且大文件导出易内存溢出;应改用官方继任者phpspreadsheet,通过composer require phpoffice/phpspreadsheet安装,配合正确响应头、ob_end_clean()、rawurlencode()中文文件名及分块写入规避问题。

ThinkPHP5 默认不带 Excel 导出能力,必须引入第三方库;直接用 PHPExcel 会报错或内存溢出,推荐改用 PhpSpreadsheet(PHPExcel 官方继任者),且需手动处理响应头和输出流。
为什么不能直接用 PHPExcel?
ThinkPHP5 的 Composer 环境默认拉取的是 PHP 7.1+ 版本,而 PHPExcel 最后一个稳定版(1.8.2)已停止维护,不兼容 PHP 7.4+ 的严格类型检查,运行时常见报错如:Declaration of PHPExcel_Shared_Escher_DggContainer_BstoreContainer::setBlipStore($blipStore) must be compatible with PHPExcel_Shared_Escher_DggContainer::setBlipStore($blipStore)。此外,它对大文件导出支持差,容易触发 Allowed memory size exhausted。
如何正确安装并使用 PhpSpreadsheet?
在项目根目录执行:
composer require phpoffice/phpspreadsheet
注意:不要加 --dev,否则生产环境无法加载。安装后,在控制器中按如下方式使用:
- 用
use PhpOffice\PhpSpreadsheet\Spreadsheet;和use PhpOffice\PhpSpreadsheet\Writer\Xlsx;引入核心类 - 构造
Spreadsheet实例后,用$spreadsheet->getActiveSheet()->setCellValue('A1', '标题');写入数据,避免循环中反复调用getActiveSheet(),应提前存为变量 - 导出前必须清空输出缓冲区:
ob_end_clean();,否则会混入 HTML 或空白字符导致 Excel 打不开 - 设置响应头时,
Content-Type必须为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,不是application/octet-stream,否则 IE/Edge 可能无法识别
导出大数据量时怎么避免内存爆炸?
PhpSpreadsheet 默认将整张表加载进内存,10 万行以上就容易崩。解决方法是启用「只读模式」+「行迭代器」:
- 创建实例时传入配置:
$spreadsheet = new Spreadsheet(['memoryCacheSize' => '64MB']); - 写入数据不用全量数组,改用
$spreadsheet->getActiveSheet()->fromArray($chunk, NULL, 'A'.$startRow);分块写入(每 500 行 flush 一次) - 更彻底的方案是跳过
Spreadsheet对象,直接用PhpOffice\PhpSpreadsheet\Writer\Xlsx的底层流写入 —— 但 TP5 没封装该能力,需自行构造ZipArchive写入[Content_Types].xml等模板文件,成本高,仅建议超 50 万行场景评估
导出中文文件名乱码怎么办?
浏览器对 Content-Disposition 中文文件名解析不一致,TP5 的 Response 类默认不处理。必须手动编码:
header('Content-Disposition: attachment; filename="' . rawurlencode('报表_' . date('Ymd_His') . '.xlsx') . '"');
注意:rawurlencode() 是关键,不能用 urlencode()(斜杠会被转义)或 mb_convert_encoding()(Chrome 不认)。另外,确保控制器方法末尾没有 return $this->fetch(); 类似视图输出,否则会叠加响应体。
真正麻烦的不是写几行 setCellValue,而是响应头、缓冲区、编码、内存这四点连环出问题;调试时先用小数据 + file_put_contents('test.xlsx', $writer->writeToPath()) 确认生成无误,再切到浏览器下载流。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











