EasyExcel导入数据始终为空问题

本文探讨了在实体类中使用@Accessors(chain=true)注解可能导致数据读取异常的情况,提醒开发者注意该注解的使用,避免数据为空的问题。重点讲解了该注解的作用以及在特定场景下的潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入的实体类,如果有@Accessors(chain = true)注解,会让读取的数据行始终为空!!!
记住,不能加!

### 解决 EasyExcel 读取数据问题 当使用 EasyExcel 进行 Excel 文件的数据读取时,可能会遇到某些单元格或整行数据的情况。为了有效处理这些情况并确保程序能够正常运行而不抛出异常,可以采取以下几种方法: #### 方法一:忽略列或添加对应的列 如果 Excel 中存在未定义但在 Java 实体类中有映射关系的列,则可能导致读取错误。可以通过移除实体类中不必要的注解或将缺失的列作为白列加入到 Excel 表格里来解决此问题[^1]。 ```java // 假设有一个名为 "unnecessaryColumn" 的属性不再需要被读取 public class DataModel { // 移除此处或其他地方对该列的 @ExcelProperty 注释 } ``` #### 方法二:自定义转换器处理特殊类型的值 对于特定类型(如日期),即使在 Excel 中显示为非,在导入过程中也可能被视为 `null` 或者其他默认值。此时可创建自定义转换器来进行更精确地控制如何解析这类特殊情况下的输入[^4]。 ```java import com.alibaba.excel.converters.Converter; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.util.DateUtils; import java.text.ParseException; import java.util.Date; /** * 自定义日期转换器用于处理可能存在的格式化差异等问题. */ public class CustomDateConverter implements Converter<Date> { @Override public Class<?> supportJavaTypeKey() { return Date.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } /** * 将字符串形式的时间戳转成日期对象. * * @param cellData 单元格内的原始数据 * @param globalConfiguration 全局配置项 * @return 返回转换后的日期实例 */ @Override public Date convertToJavaData(CellData cellData, GlobalConfiguration globalConfiguration) throws ParseException { String dateString = cellData.getStringValue(); if (dateString == null || "".equals(dateString.trim())) { return null; // 对于完全为的内容直接返回null } try { return DateUtils.parseDate(cellData.getStringValue(), new String[]{"yyyy/MM/dd"}); } catch (ParseException e) { throw new RuntimeException("Failed to parse date string [" + dateString + "]"); } } } ``` #### 方法三:过滤掉多余的空行 有时尽管实际有用的数据只有一部分,但是由于各种原因导致额外的空行也被包含进来。为了避免这种情况影响后续操作,可以在读取完成后通过遍历集合的方式去除那些所有字段均为 `null` 的记录[^3]。 ```java List<DataModel> dataList = ... ; // 此处获取由EasyExcel读取出的结果列表 Iterator<DataModel> iterator = dataList.iterator(); while(iterator.hasNext()){ boolean allNullFields = true; DataModel item = iterator.next(); for(Field field : DataModel.class.getDeclaredFields()){ field.setAccessible(true); Object value = field.get(item); if(value != null && !"".equals(String.valueOf(value).trim())){ allNullFields=false;break; } } if(allNullFields){ iterator.remove(); // 如果当前元素的所有字段都为则将其从迭代器中移除 } } System.out.println(dataList.size()); // 输出最终保留下来的条目数量 ``` 以上三种方式可以根据具体应用场景组合运用以达到最佳效果。值得注意的是,在开发阶段应当充分测试不同情况下可能出现的各种边界条件,从而保证系统的稳定性和可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值