Spring Boot中使用org.jxls读取Excel时如何处理空单元格?
解决jXLS读取Excel时空单元格抛出XLSDataReadException的问题
问题分析
你当前配置的IsEmptyCellCheck是jXLS默认的空单元格检查器,它的作用是当单元格为空时主动抛出异常,所以这个配置不仅没解决问题,反而会触发你想避免的错误。
解决方案
1. 自定义空单元格检查器(推荐)
实现自定义的CellCheckEvaluator,让空单元格的检查通过而不中断读取:
import org.jxls.common.CellData; import org.jxls.common.cell.reader.CellCheckEvaluator; public class IgnoreEmptyCellCheck implements CellCheckEvaluator { @Override public boolean evaluate(CellData cellData) { // 单元格为空时返回true,表示检查通过,继续读取后续内容 return cellData == null || cellData.getCellValue() == null || cellData.getCellValue().toString().trim().isEmpty(); } }
然后在XML配置中替换原有的cellcheck:
<cellcheck offset="0" evaluator="com.osi.exceljxls.IgnoreEmptyCellCheck" />
2. 确保实体类字段支持空值
如果异常是因为空单元格映射到基本类型(如int)导致的类型转换错误,把实体类中的基本类型改成对应的包装类:
public class Estimation { private String role; // 将int改为Integer,支持null值映射 private Integer noOfResources; private String projectLocation; // 其他字段... }
3. 调整循环终止逻辑
你的loopbreakcondition是检查第一列单元格为空时终止循环,这个逻辑适合判断数据行结束,但要注意不要和普通空单元格检查混淆。如果需要跳过中间存在空白单元格的数据行,可以修改rowcheck的判断逻辑。
4. 捕获异常并继续读取
如果配置方式无法满足需求,可在读取代码中捕获XLSDataReadException,记录日志后继续执行:
import org.jxls.reader.XLSDataReadException; import org.jxls.reader.XLSReader; import org.jxls.reader.ReaderBuilder; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; // 读取逻辑示例 List<Estimation> estimations = new ArrayList<>(); Map<String, Object> beans = Map.of("estimations", estimations); try (FileInputStream configStream = new FileInputStream("excel-config.xml"); FileInputStream excelStream = new FileInputStream("data.xlsx")) { XLSReader reader = ReaderBuilder.buildFromXML(configStream); reader.read(excelStream, beans); } catch (XLSDataReadException e) { // 记录异常,跳过当前行继续处理 System.err.println("读取单元格遇到空值,跳过当前行: " + e.getMessage()); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

