# POI判断单元格是否为空

依赖


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.lang.Nullable;

方法 一

/**
     * 判断给定的Excel行是否为空。
     *
     * @param row 可能为null的Row对象,代表Excel的一行。
     * @return 返回行是否为空的布尔值。如果行为空或所有单元格都为空白,则返回true;如果行中至少有一个非空白单元格,则返回false。
     */
    public static boolean isRowEmptyTwo(@Nullable Row row) {
        if (row == null) {
            // 行对象为null,直接认为该行是“空”的
            return true;
        }

        // 遍历行中的所有单元格
        for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
            Cell cell = row.getCell(c);
            // 如果单元格不为空且不是空白类型,则行不为空,可以立即返回false
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                return false;
            }
        }
        // 所有单元格都为空或不存在,行为空
        return true;
    }

方法二

/**
     * 判断给定的Excel表格行是否为空。
     *
     * @param row 需要判断的行对象,来自Excel表格。如果为null,则返回true。
     * @return 如果该行所有的单元格都为空或者不存在,则返回true;否则返回false。
     */
    private static boolean isCellEmpty(Cell cell) {
    CellType cellType = cell.getCellType();
    switch (cellType) {
        case BLANK:
            return true;
        case NUMERIC:
            // 考虑到0可能是一个有意义的数值,这里可以根据实际情况决定是否认为是空
            return cell.getNumericCellValue() == 0;
        case STRING:
            return cell.getStringCellValue().isEmpty();
        case BOOLEAN:
            return !cell.getBooleanCellValue();
        case FORMULA:
            try {
                return cell.getNumericCellValue() == 0; // 或者根据公式计算结果的具体情况进行判断
            } catch (IllegalStateException e) {
                LOGGER.log(Level.WARNING, "Error evaluating formula cell", e);
                return true; // 公式错误,视该单元格为空
            }
        case ERROR:
            // 对于错误类型的单元格,可以认为是非空
            return false;
        case DATE:
            // 对于日期类型的单元格,一般不会将其视为空(除非是1900年1月0日这种特殊的日期格式代表的“空”)
            return false;
        default:
            // 对于未知或未来可能出现的新类型,也可以在此进行处理或者抛出异常
            throw new IllegalStateException("Unsupported cell type: " + cellType);
    }
}

船森版本

import org.apache.poi.ss.usermodel.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ExcelUtils {

    private static final Logger LOGGER = Logger.getLogger(ExcelUtils.class.getName());

    /**
     * 判断给定的Excel表格行是否为空。
     *
     * @param row 需要判断的行对象,来自Excel表格。如果为null,则返回true。
     * @return 如果该行所有的单元格都为空或者不存在,则返回true;否则返回false。
     */
    public static boolean isRowEmpty(@Nullable Row row) {
        if (row == null) {
            // 如果行对象为null,直接认为该行是“空”的
            return true;
        }

        // 遍历行中的所有单元格
        int firstCell = row.getFirstCellNum();
        int lastCell = row.getLastCellNum();
        if (firstCell > lastCell) {
            LOGGER.log(Level.WARNING, "Row has invalid cell range: firstCellNum > lastCellNum");
            return true; // 或者根据需求抛出异常
        }

        for (int c = firstCell; c <= lastCell; c++) {
            Cell cell = row.getCell(c);
            if (cell != null && !isCellEmpty(cell)) {
                // 所有单元格都为空或不存在,行为空
                return false;
            }
        }
        // 所有单元格都为空或不存在,行为空
        return true;
    }

    /**
     * 判断单元格是否为空。
     * @param cell 需要判断的单元格对象。
     * @return 如果单元格为空或者视作空,则返回true;否则返回false。
     */
    private static boolean isCellEmpty(Cell cell) {
        CellType cellType = cell.getCellType();
        switch (cellType) {
            case BLANK:
                return true;
            case NUMERIC:
                return cell.getNumericCellValue() == 0;
            case STRING:
                return cell.getStringCellValue().isEmpty();
            case FORMULA:
                try {
                    return cell.getNumericCellValue() == 0;
                } catch (IllegalStateException e) {
                    LOGGER.log(Level.WARNING, "Error evaluating formula cell", e);
                    return true; // 公式错误,视该单元格为空
                }
            default:
                return false;
        }
    }
}

一般方法一就够用了,按需选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>