EasyExcel合并单元行没填不能解析数据
最近在做Excel报表开发,要开发一个一对多,合并单元行的Excel导入功能,因为开发时间比较赶,所以想到使用开源的EasyExcel组件来开发,不过在开发中遇到一个问题,就是那些合并单元格,一整行都不填的情况,使用EasyExcel去解析数据时候,是一张行数据都不能解析到,使用过EasyExcel的读者应该可以理解到我的意思,写出来分享出来,希望遇到这个问题的开发者也可以马上处理问题
自定义的AnalysisEventListener:
package com.common.excel;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class EasyExcelListener<T> extends AnalysisEventListener<T> {
private List<T> datas;
private Integer rowIndex;
private List<CellExtra> extraMergeInfoList;
public EasyExcelListener(Integer rowIndex) {
this.rowIndex = rowIndex;
datas = new ArrayList<>();
extraMergeInfoList = new ArrayList<>();
}
@Override
public void invoke(T data, AnalysisContext context) {
//log.info("解析到一条数据: {}", JSONUtil.toJsonPrettyStr(data));
ReflectUtil.invoke(data, "setIndex", StrUtil.toString(context.readRowHolder().getRowIndex()));
datas.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据解析完成!");
}
@Override
public void extra(CellExtra extra, AnalysisContext context) {
//log.info("读取到了一条额外信息:{}", JSONUtil.toJsonPrettyStr(extra));
switch (extra.getType()) {
case MERGE:
if (extra.getRowIndex() >= rowIndex) {
extraMergeInfoList.add(extra);
}
break;
default:
}
}
public List<T> getData() {
return datas;
}
public List<CellExtra> getExtraMergeInfoList() {
return extraMergeInfoList;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
读取Excel表代码:
EasyExcelListener easyExcelListener = new EasyExcelListener(headRowNumber);
EasyExcel.read(file.getInputStream(), UnitIllegalExcelDto.class, easyExcelListener)
.extraRead(CellExtraTypeEnum.MERGE)
.sheet(sheetNo)
.headRowNumber(headRowNumber)
.doRead();
List<CellExtra> extraMergeInfoList = easyExcelListener.getExtraMergeInfoList();
List<UnitIllegalExcelDto> data = new ExcelMergeHelper().explainMergeData(easyExcelListener.getData(), extraMergeInfoList, headRowNumber);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
使用上面EasyExcelListener去读取Excel数据,会一直将合并单元格不填的一整行数据直接忽略了,通过debug看到框架不支持这种数据的解析,其实向正常的数据导入也不影响,但是需求是要做校验的,这些合并单元格不填也要校验,数据拿不到就不能做校验,所以也烦恼了我一个上午,去GitHub也找不到对应issue
后面通过EasyExcel交流群,技术人员的回复,知道可以在invoke方法里加上context.readWorkbookHolder().setIgnoreEmptyRow(false);
,经过沟通,EasyExcel默认是不读取这些合并单元格都不填的数据的,所以这样修改就可以拿到数据:
@Override
public void invoke(T data, AnalysisContext context) {
//log.info("解析到一条数据: {}", JSONUtil.toJsonPrettyStr(data));
context.readWorkbookHolder().setIgnoreEmptyRow(false);
ReflectUtil.invoke(data, "setIndex", StrUtil.toString(context.readRowHolder().getRowIndex()));
datas.add(data);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。
原文链接:smilenicky.blog.csdn.net/article/details/123511660
- 点赞
- 收藏
- 关注作者
评论(0)