最近在项目中导入excel表格偶尔会出现报错:PhpOffice\PhpSpreadsheet\Reader\Xlsx::getArrayItem(): Node no longer exists
修复方式:【在载入文件前设置只读】
原因:不同版本和厂商的excel文件可能导致一些未知错误。
$reader->setReadDataOnly(true);
完整示例:
protected function getExcelData($request, $start = 3) { $file = $request['file'] ?? []; if (!$file) $this->throw('请上传文件'); $type = IOFactory::identify($file['tmp_name']); //使用自动阅读器解析识别文件类型。 $reader = IOFactory::createReader($type); //创建读取器 $reader->setReadDataOnly(true); //设置只读 $spreadsheet = $reader->load($file['tmp_name']); //从文件中加载 $activesheet = $spreadsheet->getActiveSheet(); //获取活动工作表 $highest = $activesheet->getHighestRowAndColumn(); //获取具有单元格记录的最高工作表列和最高行。 $highestColumnIndex = Coordinate::columnIndexFromString($highest['column']); //字符串中的列索引 $data = []; for ($col = 1; $col <= $highestColumnIndex; $col++) { $mark = Coordinate::stringFromColumnIndex($col); //来自列索引的字符串 for ($row = 1; $row <= $highest['row']; $row++) { $key = $mark . $row; $value = $activesheet->getCell($key)->getFormattedValue(); //使用格式获取单元格值 $data[$row][$mark] = $value; } } foreach ($data as $key => $item) { if (!array_filter($item)) unset($data[$key]); } if (count($data) < $start) $this->throw('请填写表格'); return $data; }
登录后可发表评论