正确安装 PhpSpreadsheet 应运行 composer require phpoffice/phpspreadsheet,确认 PHP≥7.4,用 IOFactory::load() 读取文件,导出 CSV 需手动添加 UTF-8 BOM 并避免使用 PhpSpreadsheet 内置 CSV 写入器。

怎么用 Composer 安装 PhpSpreadsheet(不是PHPExcel)
现在官方维护的 Excel 处理库是 phpoffice/phpspreadsheet,phpexcel 已废弃多年,强行装会报 Package phpexcel/phpexcel is abandoned 警告,且不兼容 PHP 8+。
正确做法是:
- 运行
composer require phpoffice/phpspreadsheet - 如果项目用了 Laravel,别急着装
maatwebsite/excel—— 它只是 PhpSpreadsheet 的封装,新版已转向维护自己的laravel-excel包(注意命名变化) - 确认 PHP 版本 ≥ 7.4(推荐 8.0+),否则可能因依赖冲突安装失败
表格导入导出最简可用代码结构
不用框架、不写路由,纯命令行或脚本里跑通才是验证是否真装对的关键。常见卡点是没设好内存和时区,导致读大文件崩溃或日期错乱。
示例:读取 data.xlsx 并输出第一行
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
<?php require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = IOFactory::load('data.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
var_dump($worksheet->rangeToArray('A1:D1')[0]);
- 必须用
IOFactory::load(),不是new Spreadsheet()(那是新建空表) - 读取大文件前加
ini_set('memory_limit', '512M');,否则容易Fatal error: Allowed memory size exhausted - 日期单元格默认返回 Excel 序列号(如 44197),需用
$worksheet->getCell('A1')->getFormattedValue()或手动转:PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value)
为什么导出 CSV 总是乱码?
本质是编码没对齐:PHP 输出的是 UTF-8,但 Excel 默认按系统编码(Windows 是 GBK/GB2312)打开 CSV。直接写 fopen(..., 'w') 不加 BOM,Excel 就认不出。
- 导出 CSV 时,第一行写入 UTF-8 BOM:
echo "\xEF\xBB\xBF"; - 字段值用双引号包裹,内部双引号要转义为两个双引号(不是反斜杠)
- 别用
PhpSpreadsheet导出 CSV —— 它生成的是“伪 CSV”,实际调用的是 Excel 引擎,体积大、慢、还可能带格式残留;直接手写更稳 - 如果非要用,得显式指定写入器:
$writer = IOFactory::createWriter($spreadsheet, 'Csv');,再调$writer->setUseBom(true);
Laravel 下 maatwebsite/excel 和 laravel-excel 怎么选?
旧版 maatwebsite/excel(v3)只支持 Laravel 5.8–6.x,且作者已移交维护权。当前活跃分支是 laravel-excel(v4+),包名仍是 maatwebsite/excel,但 Composer 安装时要指定版本:
- Laravel 9/10:装
composer require maatwebsite/excel:^4.0 - 别信文档里“自动发现”的说法——Laravel 8+ 需手动在
config/app.php的providers加Maatwebsite\Excel\ExcelServiceProvider::class(除非你关了 package discovery) - 导出到浏览器时,如果响应头没生效,大概率是中间件拦截了
Content-Disposition,检查是否启用了TrimStrings或ConvertEmptyStringsToNull中间件(它们会干扰二进制响应)
复杂点在于:PhpSpreadsheet 本身不处理 HTTP 响应,所有“下载”逻辑都由框架封装层控制,一旦出问题,得一层层查是 IOFactory 报错、Writer 写失败,还是响应被截断 —— 先用命令行跑通读写,再接入 Web 流程。










