php 8.3 不支持 phpexcel,因其已停止维护且依赖大量被移除的 php 特性;应改用官方继任者 phpspreadsheet,它完全兼容 php 8.3,api 高度兼容,只需替换命名空间和类名,并注意路径编码、中文显示、文件格式及日期转换等常见问题。

PHP 8.3 无法直接使用 PHPExcel —— 它早已停止维护,且不兼容 PHP 8.x(尤其是 8.2+ 的严格类型和弃用语法),运行会报 Fatal error: Uncaught Error: Call to undefined function set_magic_quotes_runtime() 或 Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated 等错误。
PHPExcel 在 PHP 8.3 上根本跑不起来
PHPExcel 最后一个稳定版是 1.8.2(2015 年发布),依赖大量已被 PHP 7.4+ 废弃、PHP 8.0+ 彻底移除的特性,比如:
-
set_magic_quotes_runtime()(PHP 5.4 已废弃,8.0 移除) - 未声明返回类型的函数(PHP 8.0+ 启用严格模式后触发致命错误)
- 使用
mb_split()但未检查函数是否存在(PHP 8.2+ 移除了该函数) - 类属性未声明类型,与 PHP 8.1+ 的属性类型推断冲突
即使你用 composer require phpoffice/phpexcel 强行安装,启动时就会挂掉,不是警告,是直接 Fatal error。
用 PhpSpreadsheet 替代 PHPExcel(官方推荐迁移路径)
PHPExcel 团队自己开发了继任者 PhpSpreadsheet,它专为 PHP 7.2+ 设计,完整支持 PHP 8.3,API 高度兼容(大部分代码只需改命名空间和类名)。
- 安装命令:
composer require phpoffice/phpspreadsheet - 旧代码中
require 'Classes/PHPExcel.php'→ 改为require 'vendor/autoload.php' - 类名替换示例:
PHPExcel→PhpOffice\PhpSpreadsheet\Spreadsheet,PHPExcel_IOFactory→PhpOffice\PhpSpreadsheet\IOFactory - 读取 Excel:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('data.xlsx'); - 写入 Excel:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');(注意:不再支持Excel5即 .xls 格式,如需 xls,得用LegacyExcel5扩展,但不推荐)
性能上,PhpSpreadsheet 默认内存占用略高,大文件建议启用缓存:$reader->setReadDataOnly(true) 或用 MemoryCache 配置。
读写常见坑:路径、格式、中文乱码
在 PHP 8.3 下用 PhpSpreadsheet 处理中文 Excel 时,这几个点最容易卡住:
- 读取含中文路径的文件:确保路径是 UTF-8 编码(Windows 下用
mb_convert_encoding($path, 'UTF-8', 'GBK')转换,否则file_get_contents()报No such file) - 写入中文到单元格:无需额外设置编码,但必须确保 PHP 文件本身保存为 UTF-8 无 BOM;若导出后 Excel 显示方块,大概率是字体问题,加一行
$cell->getStyle()->getFont()->setName('Microsoft YaHei'); - 读取 .xls 文件失败:PhpSpreadsheet 默认只支持 .xlsx/.csv/.ods;要读 .xls,需额外装
phpoffice/phpspreadsheet的legacy分支或改用robrichards/wincache(不现实),更实际的做法是用 LibreOffice 命令行先转成 xlsx:soffice --headless --convert-to xlsx input.xls - 日期读出来是数字(如 44562):这是 Excel 的序列日期,用
\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value)转成DateTime对象
PhpSpreadsheet 的文档虽不如当年 PHPExcel 齐全,但源码里的 samples/ 目录足够覆盖 90% 场景;真正难的不是语法,而是理解 Excel 内部结构(比如合并单元格、样式继承、公式缓存)——这些在 PHP 8.3 下不会突然变简单,该查源码还得查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











