PHP Spreadsheet空行校验问题:如何处理Excel末尾空行?
解决方案
要保留中间空行校验,同时允许末尾空行作为数据结束标志,可以通过先收集所有有效行、再校验连续性的方式实现,逻辑更清晰且避免误判:
修改后的代码
$startRow = 9; $highestRow = $worksheet->getHighestRow(); $validRows = []; // 收集第9行及之后A列非空的行号 for ($row = $startRow; $row <= $highestRow; $row++) { if (trim($worksheet->getCell("A$row")->getValue()) !== '') { $validRows[] = $row; } } // 校验起始行(第9行)不能为空 if (empty($validRows) || $validRows[0] !== $startRow) { return redirect()->back()->with('error', "Attenzione! la riga $startRow non può essere vuota!"); } // 校验中间行是否存在空行(有效行号必须连续) for ($i = 1; $i < count($validRows); $i++) { if ($validRows[$i] !== $validRows[$i-1] + 1) { $emptyRow = $validRows[$i-1] + 1; return redirect()->back()->with('error', "Attenzione! la riga $emptyRow non può essere vuota!"); } } // 处理所有有效行的数据 $data_detail = []; foreach ($validRows as $row) { $newEntry = []; $newEntry['codice_articolo'] = trim($worksheet->getCell("A$row")->getValue()); $newEntry['quantita'] = trim($worksheet->getCell("B$row")->getValue()); $newEntry['prezzo'] = number_format( floatval(str_replace(',','.',trim($worksheet->getCell("C$row")->getValue()))), 4, '.', '' ); // 校验商品编码是否存在 $db_cod_art = DB::connection('oracle') ->table('orders') ->where(DB::raw("TRIM(cod_art)"), $newEntry['codice_articolo']) ->count('cod_art'); if ($db_cod_art != 1) { return redirect()->back()->with('error', "Attenzione! Il codice articolo {$newEntry['codice_articolo']} alla riga $row non esiste!"); } $data_detail[] = $newEntry; } // 数据处理完成后可添加成功逻辑 // return redirect()->back()->with('success', 'Dati importati correttamente!');
关键修改说明
- 收集有效行:遍历工作表所有行,筛选出第9行及之后A列有内容的行号,自动忽略末尾空行。
- 起始行校验:确保第9行必须有数据,符合业务要求。
- 中间空行校验:检查有效行的行号是否连续,若存在间隔则说明中间有空行,抛出对应错误。
- 数据处理:仅遍历有效行处理数据,避免了原代码中对末尾空行的误判。
内容的提问来源于stack exchange,提问作者user18182496
相关产品推荐
相关产品推荐

