PhpSpreadsheet 报错 Could not find zip member zip ......

新手上路,请多包涵

环境如下

PHP:8.1
laravel:9.1

maatwebsite/excel: ^3.1
phpoffice/phpspreadsheet: ^1.23

laravel-excel所需模块已开通

PHP extension php_zip enabled
PHP extension php_xml enabled
PHP extension php_gd2 enabled
PHP extension php_iconv enabled
PHP extension php_simplexml enabled
PHP extension php_xmlreader enabled
PHP extension php_zlib enabled

报错如下

 "message": "Could not find zip member zip:/.../xshop/storage/framework/cache/laravel-excel/laravel-excel-bNBKc58OvD0foVxKWvOINLvChKGasiSj.xlsx#_rels/.rels",
    "exception": "PhpOffice\\PhpSpreadsheet\\Reader\\Exception",
    "file": ".../xshop/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php",
    "line": 159,
    "trace": [ ...... ]

应该不是framework/cache/laravel-excel权限问题

阅读 7.7k
1 个回答
    /**
     * 使用物理路径中的文件作为数据源导入
     * @param string $excelFilePath excel文件的物理地址
     * @param int $startRow 数据的起始行,默认为2.从第二行开始即为数据
     * @param int $sheetIndex 读取Excel文件中哪个sheet, 默认为0,即第一个工作表
     * @return array 一个二维数组
     * @throws Exception|\PhpOffice\PhpSpreadsheet\Exception
     */
    public function importFile(string $excelFilePath, int $startRow=2, int $sheetIndex=0): array{
        // $reader = new Xlsx();
        // $reader->setReadDataOnly(true);
        // 是Xsl?Xlsx
        $fileMode = $this->getFileExt($excelFilePath);
        $reader = IOFactory::createReader($fileMode);
        $reader->setReadDataOnly(true);
        $spreadsheet = $reader->load($excelFilePath);
        $currentSheet = $spreadsheet->getSheet($sheetIndex);
        // ....
}
    // 返回文件的扩展名.以决定使用: Xsl or Xlsx
    private function getFileExt($excelFilePath){
        $t = Tools::parseFileInfo($excelFilePath, ['extension']);
        return !empty($t['extension'])?ucfirst($t['extension']):'Xsl';
    }
   // parseFileInfo如下:
    /**
     * 返回文件的路径信息. 方法基于: pathinfo
     * @param string $path 文件路径,注意不是URL
     * @param array $fields 方法结果的key数组. 可选的有:dirname, basename, extension, filename
     * @return array 方法返回一个关联数组
     */
    public static function parseFileInfo(string $path, array $fields): array
    {
        $rs = pathinfo($path);
        return array_filter($rs, function ($key) use ($fields) {
            return in_array($key, $fields);
        }, ARRAY_FILTER_USE_KEY);
    }