依赖
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;
}
}
}
一般方法一就够用了,按需选择