PhpSpreadsheet解析.xls文件报Could not find zip member错误如何解决
报错原因
- 直接原因:文件格式与读取器不匹配。你使用的是
.xls后缀的二进制格式老版Excel文件,而代码中除CSV外默认使用Xlsx读取器解析文件。Xlsx读取器仅支持解析本质为ZIP压缩包的.xlsx格式文件,尝试解析非ZIP结构的.xls文件时,就会抛出找不到ZIP内部成员的异常。 - 代码逻辑缺陷:你当前仅对CSV格式做了单独判断,其余格式全部默认交给
Xlsx读取器处理,完全遗漏了.xls格式的适配逻辑。同时仅通过文件后缀判断格式的规则可靠性较低,存在文件后缀被篡改导致判断失效的风险。
修复方案
方案1:手动补全读取器判断逻辑
- 首先在文件顶部的use声明中添加Xls读取器引入:
use PhpOffice\PhpSpreadsheet\Reader\Xls;
- 修改读取器初始化的分支判断,补充
.xls格式的处理逻辑:
if('csv' == $extension) { $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); } elseif ('xls' == $extension) { $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); } else { $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); }
方案2:使用内置自动识别能力(更稳定,推荐)
不需要自己维护后缀、MIME类型判断规则,直接使用PhpSpreadsheet提供的IOFactory自动匹配对应读取器,替换原有读取器初始化代码即可:
// 移除原有判断后缀创建读取器的所有代码,替换为以下两行 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($_FILES['file']['tmp_name']); $spreadsheet = $reader->load($_FILES['file']['tmp_name']);
该方法会自动根据文件真实内容匹配对应的读取器,兼容CSV、XLS、XLSX等多种格式,容错性更高。
内容的提问来源于stack exchange,提问作者Ivan Savin
相关产品推荐
相关产品推荐

