PHPExcel 已废弃,新项目应改用 PhpSpreadsheet;需重写类名与命名空间,如 new \PhpOffice\PhpSpreadsheet\Spreadsheet();读写性能、中文乱码、日期处理等需针对性配置。

PHPExcel 已废弃,别再新项目里用了
PHP 7.4+ 环境下直接装 PHPExcel 会报错,Composer 安装失败或运行时抛 Class 'PHPExcel' not found。它早在 2015 年就停止维护,官方明确推荐迁移到 PhpSpreadsheet——这是它的完全重写版,命名空间、API、依赖都不同,不能简单替换类名了。
- 旧代码用
new PHPExcel(),新库必须用new \PhpOffice\PhpSpreadsheet\Spreadsheet() -
PHPExcel_IOFactory对应变成\PhpOffice\PhpSpreadsheet\IOFactory - 所有类都在
PhpOffice\PhpSpreadsheet\*命名空间下,自动加载需 Composer 正常配置 - 如果只是临时读一个 Excel,又不想改代码,可用
phpoffice/phpspreadsheet+ 兼容层(如phpoffice/phpexcel-compat),但仅限过渡,不保稳定
读 Excel:IOFactory::load() 的实际用法和坑
最常见错误是传错路径或没处理文件类型,导致 Could not open file for reading 或 Invalid file format。它不是万能解析器,得靠扩展名或内容嗅探来选 Reader,而嗅探可能失败。
- 显式指定 Reader 更可靠:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'),再调$reader->load($filePath) - 支持的格式有
Xlsx、Xls、Csv、Ods,大小写敏感,xlsx会报错 - CSV 默认用逗号分隔,若用分号或制表符,得先设置:
$reader->setDelimiter(';') - 大文件(>10MB)容易内存溢出,可启用只读模式:
$reader->setReadDataOnly(true),跳过样式、公式,只取值
写 Excel:Spreadsheet 对象怎么填数据才不慢
逐单元格赋值(比如循环里写 $sheet->setCellValue('A'.$i, $val))在万行级数据下会明显变卡,本质是对象方法调用开销叠加、内存缓存未优化。
- 优先用
fromArray()批量写:$sheet->fromArray($data, null, 'A1'),$data 是二维数组,效率高一个数量级 - 避免在循环中反复调
getActiveSheet(),提前存引用:$sheet = $spreadsheet->getActiveSheet() - 写完记得清理内存:
$spreadsheet->garbageCollect(),尤其在 CLI 脚本里重复处理多个文件时 - 导出 XLSX 比 XLS 文件大、生成慢,纯数据导出且兼容老 Excel,可选
XlsWriter,但注意它不支持超过 65536 行
中文乱码和日期错位:编码和时区不是文件问题,是 PHP 层面的
读出来中文变问号、日期变成数字(如 44562),不是 Excel 本身坏了,而是 PhpSpreadsheet 默认按 UTF-8 解析文本、按 Excel 底层序列号处理时间,没做转换。
- CSV 中文乱码?不是文件编码问题,是 Reader 没设编码:
$reader->setInputEncoding('GBK')(对应 GB2312/GBK 文件) - 日期显示为数字?用
\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($excelDateValue)转成 DateTime 实例 - 写入中文到单元格后 Excel 显示方块?确保 PHP 文件本身是 UTF-8 无 BOM,且不要手动用
iconv()或mb_convert_encoding()多余转码 - 服务器时区影响时间写入结果,建议统一设为 UTC:
date_default_timezone_set('UTC'),再用 DateTime 对象写入
迁移成本比想象中高,尤其是带复杂样式的旧系统;fromArray() 和显式 Reader 是两个最该立刻改掉的习惯;时区和编码问题往往查半天,其实就一行配置的事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











