easyexcel读取数据都为空
时间: 2025-04-21 21:44:57 浏览: 97
### 解决 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()); // 输出最终保留下来的条目数量
```
以上三种方式可以根据具体应用场景组合运用以达到最佳效果。值得注意的是,在开发阶段应当充分测试不同情况下可能出现的各种边界条件,从而保证系统的稳定性和可靠性。
阅读全文
相关推荐


















