使用Apache POI判断单元格空值时无法忽略全空行的问题
解决Apache POI读取Excel时无法忽略全空行的问题
问题根源
你的代码当前仅对单个空单元格跳过赋值,但未判断整行4列是否全为空。即使所有单元格都为空,循环结束后依然会把空的RutasImportDto加入arrayList,这就是后续校验返回大量错误的原因。
解决方案
需要先检查整行的4个单元格是否全为空,只有当至少有一个单元格非空时,才将dto加入列表。具体修改如下:
- 添加标记变量记录该行是否存在非空单元格
- 遍历列时更新标记并完成赋值
- 遍历完列后,根据标记决定是否将dto加入列表
修改后的完整代码
/*-------------IMPORT Rutas----------*/ public String processImportRutas(MultipartFile fileDocument, long loggedUserId) { JSONObject jsonObject = new JSONObject(); jsonObject.put("error", ""); ArrayList<RutasImportDto> arrayList = new ArrayList<>(); try { XSSFWorkbook workbook = new XSSFWorkbook(fileDocument.getInputStream()); XSSFSheet sheet = workbook.getSheetAt(0); DataFormatter formater = new DataFormatter(); int rowCount = 1; RutasImportDto dto; for (Row row : sheet) { dto = new RutasImportDto(); // 标记该行是否有非空单元格 boolean hasNonEmptyCell = false; if (rowCount < 4) { rowCount++; continue; } if (rowCount == 4) { Cell cell = row.getCell(0); if (cell == null) { continue; } if (formater.formatCellValue(cell).equalsIgnoreCase("Nº DE PLANTA")) { rowCount++; continue;// for Row... } } for (int i = 0; i < 4; i++) { Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); String cellValue = formater.formatCellValue(cell).trim(); // 判断单元格是否为空:格式化后为空字符串则视为空 boolean isCellEmpty = cellValue.isEmpty(); if (isCellEmpty) { continue; } // 存在非空单元格,更新标记 hasNonEmptyCell = true; switch (i) { case 0: dto.setPlantNumber(cellValue); break; case 1: dto.setUserId(cellValue); break; case 2: dto.setStartDay(cellValue); break; case 3: dto.setHour(cellValue); break; default: break; } } // 只有当该行存在非空单元格时,才加入列表 if (hasNonEmptyCell) { dto.setRow(rowCount); arrayList.add(dto); } rowCount++; } jsonObject = persistImportRutas(arrayList, loggedUserId); } catch (Throwable th) { jsonObject.put("error", th.getMessage()).toString(); log.error("processImportRutas : " + th.getMessage()); log.debug("processImportRutas : " + th.getMessage(), th); } return jsonObject.toString(); }
关键修改说明
- 添加
hasNonEmptyCell布尔变量,默认false,只要有一个单元格非空就设为true - 使用
DataFormatter.formatCellValue(cell).trim()统一获取单元格值,避免因单元格类型(如BLANK、STRING、数字空值)导致的判断遗漏 - 遍历完列后,仅当
hasNonEmptyCell为true时,才将dto加入列表,彻底过滤全空行
内容的提问来源于stack exchange,提问作者Chris G
相关产品推荐
相关产品推荐

