You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache POI判断单元格空值时无法忽略全空行的问题

解决Apache POI读取Excel时无法忽略全空行的问题

问题根源

你的代码当前仅对单个空单元格跳过赋值,但未判断整行4列是否全为空。即使所有单元格都为空,循环结束后依然会把空的RutasImportDto加入arrayList,这就是后续校验返回大量错误的原因。

解决方案

需要先检查整行的4个单元格是否全为空,只有当至少有一个单元格非空时,才将dto加入列表。具体修改如下:

  1. 添加标记变量记录该行是否存在非空单元格
  2. 遍历列时更新标记并完成赋值
  3. 遍历完列后,根据标记决定是否将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:17:48