发布于2026-07-06 阅读(0)
扫一扫,手机访问
先说一个明确的结论:PHPExcel 已经正式退休了,别再往 ThinkPHP 项目里硬塞它。2019 年官方归档之后,不修漏洞、不兼容 PHP 8+、连 Composer 自动加载都玩不转,继续用只会给自己挖坑。当前唯一合理的方案是迁移到 PhpSpreadsheet(即 phpoffice/phpspreadsheet),这才是 ThinkPHP 6/7 和 PHP 7.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+ 构造函数警告)setEncoding 修复(因底层编码逻辑已过时)PhpSpreadsheet 在 ThinkPHP 中的最小可用集成不是“装上就能用”,关键在于加载方式和命名空间适配:
composer require phpoffice/phpspreadsheet,确保 vendor/autoload.php 已被 ThinkPHP 正确引入(TP6 默认已做)use PhpOffice\PhpSpreadsheet\Spreadsheet;、use PhpOffice\PhpSpreadsheet\IOFactory;new PHPExcel() 或调用 PHPExcel_IOFactory::load() —— 这些类已不存在config/app.php 中 'default_module' => 'index' 等配置未干扰自动加载路径大文件(>5MB 或 >10,000 行)导入容易卡死或报 Fatal error: Allowed memory size exhausted。不能只靠 ini_set('memory_limit', '1G') 撑:
IOFactory::load($filePath) 后,立刻调用 $spreadsheet->getActiveSheet()->toArray(null, true, true, false) —— 第四个参数设为 false 可禁用公式计算,大幅提速$sheet->getHighestRow() 获取真实行数,避免 foreach 全量读取空行Db::transaction() 提交,而不是全量插入后一次性 commitunlink($filePath) 清理,否则磁盘会被撑爆(尤其在并发导入场景)这个错误几乎都源于用户数据里带了 =、+、-、@ 开头的字符串(比如手机号 =13812345678 被 Excel 当成公式)。PhpSpreadsheet 默认不做转义:
$value = preg_match('/^[=+\-@]/', $raw) ? "\t" . $raw : $raw;setCellValueExplicit() 强制指定数据类型:$sheet->setCellValueExplicit('A1', $value, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);真正容易被忽略的是:导出响应头中的 Content-Type 必须严格匹配文件后缀。用 Xlsx 写器却返回 application/vnd.ms-excel(对应 .xls),会导致 Excel 打开时反复提示“文件格式与扩展名不匹配”。该问题在 IE 或旧版 WPS 上尤为明显。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8