必须迁移到PhpSpreadsheet,因PHPExcel已于2019年归档,不修复漏洞、不兼容PHP8+及Composer自动加载,而PhpSpreadsheet是官方继任者,支持TP6/7与PHP7.2+,需正确使用命名空间、流式加载、空行过滤及响应头设置。

PHPExcel 已停止维护,不建议在新项目中使用,也不该作为 ThinkPHP 的默认集成方案。当前应统一迁移到 PhpSpreadsheet(即 phpoffice/phpspreadsheet),它才是 PHP 7.2+ 和 ThinkPHP 6/7 的实际兼容主力。
为什么不能继续用 PHPExcel?
官方早在 2019 年就正式归档了 PHPExcel 仓库,不再修复安全漏洞、不支持 PHP 8+、不兼容现代 Composer 自动加载规则。你在 ThinkPHP 中强行 require PHPExcel.php 或手动引入类文件,极大概率会遇到:
-
Class 'PHPExcel' not found(自动加载失败) -
Deprecated: Methods with the same name as their class will not be constructors(PHP 7.2+ 构造函数警告) - 导出含中文的 Excel 时乱码,且无法通过
setEncoding修复(因底层编码逻辑已过时)
PhpSpreadsheet 在 ThinkPHP 中的最小可用集成
不是“装上就能用”,关键在于加载方式和命名空间适配:
- 执行
composer require phpoffice/phpspreadsheet,确保vendor/autoload.php已被 ThinkPHP 正确引入(TP6 默认已做) - 控制器中直接 use 官方命名空间:
use PhpOffice\PhpSpreadsheet\Spreadsheet;、use PhpOffice\PhpSpreadsheet\IOFactory; - 避免混用旧式写法,例如不要写
new PHPExcel()或调用PHPExcel_IOFactory::load()—— 这些类已不存在 - ThinkPHP 5.1 用户需确认
config/app.php中'default_module' => 'index'等配置未干扰自动加载路径
导入时跳过空行、忽略表头、防内存溢出的实操要点
大文件(>5MB 或 >10,000 行)导入容易卡死或报 Fatal error: Allowed memory size exhausted。不能只靠 ini_set('memory_limit', '1G') 撑:
通过可复用的 DuckDB 优先 ETL 执行器运行 Excel/CSV/XLSX 分析,同时保留脚本优先架构。适用于系统需要通用可导出执行器来完成标准表电子表格分析、安全只读 SQL 执行、多表注册、查询模板、验证产物、script_usage.md 使用说明、运行清单,以及调度友好的可重复输出等场景。DuckDB 为首选执行引擎;其他工具仅用于文件探测、Excel 标准化或有明确文档记录的降级场景。
- 用
IOFactory::load($filePath)后,立刻调用$spreadsheet->getActiveSheet()->toArray(null, true, true, false)—— 第四个参数设为false可禁用公式计算,大幅提速 - 遍历前先用
$sheet->getHighestRow()获取真实行数,避免 foreach 全量读取空行 - 对每批 500 行执行一次
Db::transaction()提交,而不是全量插入后一次性 commit - 临时文件上传后务必用
unlink($filePath)清理,否则磁盘会被撑爆(尤其在并发导入场景)
导出时防止 “Formula Error: An unexpected error occurred” 报错
这个错误几乎都源于用户数据里带了 =、+、-、@ 开头的字符串(比如手机号 =13812345678 被 Excel 当成公式)。PhpSpreadsheet 默认不做转义:
- 写入单元格前加一层判断:
$value = preg_match('/^[=+\-@]/', $raw) ? "\t" . $raw : $raw; - 或者统一用
setCellValueExplicit()强制指定数据类型:$sheet->setCellValueExplicit('A1', $value, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - 别依赖前端 JS 做过滤 —— 后端必须兜底,因为 Excel 文件可直接拖入,绕过所有 JS 校验
真正容易被忽略的是:导出响应头中的 Content-Type 必须严格匹配文件后缀。用 Xlsx 写器却返回 application/vnd.ms-excel(对应 .xls),会导致 Excel 打开时反复提示“文件格式与扩展名不匹配”。该问题在 IE 或旧版 WPS 上尤为明显。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










