php中读取修改.xls文件需用phpspreadsheet并显式指定excel5读写器:创建excel5 reader加载文件,修改单元格后用excel5 writer保存;避免自动探测,确保文件真实为excel97–2003格式。

PHP 中如何读取和修改 .xls 文件(不是改成 PHP 格式)
“.xls 文件改成 php 格式”这个说法本身有误解:.xls 是二进制 Excel 97–2003 表格文件,.php 是可执行脚本,二者不可直接“转换”。你真正需要的是:用 PHP 读取、修改 .xls 内容,并可能保存为新 Excel 文件(如 .xls 或 .xlsx)。核心工具是 PhpSpreadsheet(推荐)或已停止维护的 PHPExcel。
用 PhpSpreadsheet 读写 .xls 文件的实操步骤
PhpSpreadsheet 默认支持 .xlsx,但也能处理 .xls —— 需额外启用 PHPExcel 兼容层(即安装 phpoffice/phpspreadsheet 同时引入 markbaker/complex 和 markbaker/matrix,且必须启用 IOFactory 的 Excel5 reader/writer。
- 确保已通过 Composer 安装:
composer require phpoffice/phpspreadsheet - 读取
.xls文件时,显式指定Excel5:$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Excel5'); $spreadsheet = $reader->load('data.xls'); - 修改单元格:
$spreadsheet->getActiveSheet()->setCellValue('A1', '新内容'); - 保存为
.xls(保持格式):$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Excel5');,然后$writer->save('output.xls'); - 若保存为
.xlsx,改用'Xlsx'作为 writer 类型,但注意:.xls中的某些特性(如旧版条件格式、宏)可能丢失
常见报错及绕过方式:「Could not open data.xls for reading」
这个错误通常不是权限问题,而是 PhpSpreadsheet 默认不自动识别 .xls——它会尝试用 Xlsx reader 打开,失败后抛异常。必须手动指定 Excel5。
- 不要依赖
IOFactory::load()自动探测,它对.xls不可靠 - 确认文件真实是 Excel 97–2003 格式(可用
file data.xls命令检查,输出含Microsoft Excel和BOF),而非被重命名的 CSV 或加密文件 - 如果文件由 Excel 2007+「另存为 .xls」生成,有时内部结构已接近
.xlsx,此时改用Excel2007reader 可能意外成功(但不保证) - PHP 需启用
zip和xml扩展;Excel5还依赖mbstring
为什么不建议继续用 .xls?性能与兼容性现实
.xls 使用复合二进制格式(Compound Document),解析慢、内存占用高、易出错;而 .xlsx 是解压即见的 XML 结构,PhpSpreadsheet 对其优化更好,且 PHP 8+ 下 Excel5 reader 已出现兼容性退化。
立即学习“PHP免费学习笔记(深入)”;
- 新项目一律用
.xlsx输入/输出,仅在对接遗留系统时才碰.xls - 若上游只能给
.xls,可在 PHP 中先用Excel5读入,立刻转存为.xlsx作中间格式,后续操作全走Xlsx流程 - 大文件(>5MB)处理
.xls极易超内存,set_time_limit(0)和ini_set('memory_limit', '512M')只是临时止痛,本质应推动格式升级
IOFactory::createReader() 没选对类型、没装对依赖、或者误把损坏/非标文件当 .xls 处理。











