安装后报错主因是未引入 autoload、路径非绝对、内存不足或读写类型不匹配;须检查 require 'vendor/autoload.php'、用 DIR 拼接绝对路径、设 memory_limit 及正确选用 Xlsx/Xls 类。

直接用 composer require phpoffice/phpspreadsheet 就能装上,但实际导入导出功能跑不起来,多半是因为没配好 autoload、没处理好内存限制、或者读写 Excel 时路径/格式没对齐。
为什么 composer require phpoffice/phpspreadsheet 装完还报错?
常见现象是调用 IOFactory::load() 或 new Spreadsheet() 时提示类找不到,或抛出 Class 'PhpOffice\PhpSpreadsheet\IOFactory' not found。
- 检查是否在项目根目录执行命令(
composer.json所在位置),不是在vendor/里装 - 确认已引入自动加载:PHP 脚本开头必须有
require 'vendor/autoload.php';,漏掉这句就找不到任何类 - 如果用了 PSR-4 自定义命名空间(比如 Laravel 的
app/下自己写了 ExcelService),注意不要和PhpOffice命名空间冲突,Composer 不会自动重映射
读取 Excel 文件时提示 Could not open file for reading
不是权限问题,而是路径传错了——IOFactory::load() 接收的是**绝对路径**,不是相对路径或 URL。
- 用
__DIR__ . '/data/test.xlsx',别用'./data/test.xlsx'或'data/test.xlsx' - 确保文件真实存在且 PHP 进程有读权限(CLI 模式下注意用户是
www-data还是当前 shell 用户) - Excel 文件如果是从 Web 表单上传的,要用
$_FILES['file']['tmp_name'],不是$_FILES['file']['name']
use PhpOffice\PhpSpreadsheet\IOFactory;
// ✅ 正确
$spreadsheet = IOFactory::load(__DIR__ . '/uploads/order_2024.xlsx');
// ❌ 错误:路径不存在或被当成相对路径解析
$spreadsheet = IOFactory::load('uploads/order_2024.xlsx');
导出大文件时内存溢出或超时
PhpSpreadsheet 默认把整张表加载进内存,10MB 的 Excel 可能吃掉 200MB+ 内存。导出 5 万行数据很容易触发 Fatal error: Allowed memory size exhausted。
立即学习“PHP免费学习笔记(深入)”;
- 用
setMemoryLimit(-1)临时放开限制(仅开发环境),生产环境必须优化逻辑 - 改用流式写入:实例化
Spreadsheet后,用$writer->save('php://output')直接输出,避免生成临时文件再读取 - 批量写入时禁用公式计算:
$spreadsheet->getCalculationEngine()->disableCalculation(); - 导出前清空样式缓存:
$spreadsheet->garbageCollect();
中文乱码、日期变数字、公式不计算
不是编码问题,是读写时没指定正确的 Reader/Writer 类型,或者没设置时区/区域设置。
- 读 XLSX 用
Xlsx,读 XLS 用Xls,混用会导致日期解析失败(显示为 44205 这样的序列值) - 中文列名/内容正常,但导出后 Excel 显示方块?确保 PHP 文件本身是 UTF-8 编码(无 BOM),且不手动
iconv转码 - 需要保留公式结果(而非公式字符串),加载时加配置:
$reader->setReadDataOnly(false);(默认是true) - 时间字段解析错误?设置时区:
date_default_timezone_set('Asia/Shanghai');
use PhpOffice\PhpSpreadsheet\Reader\Xlsx; $reader = new Xlsx(); $reader->setReadDataOnly(false); // 读取公式值,不是公式文本 $spreadsheet = $reader->load(__DIR__ . '/input.xlsx');
真正卡住的地方往往不是安装,而是路径、内存、读写模式这三处细节。尤其在 CLI 和 Web 环境切换时,__DIR__ 指向不同,memory_limit 配置不同,连错误表现都可能一样但原因完全不同。










