EasyExcel读取跨行单元格数据为空的解决办法
目标excel文件内容如下
由于A列的“Y00001”和C列的数据是B4,B5,B6共用的数据项,我理想中的情况是easyexcel在做读取操作时,在读取三行数据时都会把A列和C列的数据给读出来。但是在读取的时候,只有第一次读取能把A、C列的数据读取出来,后面两次读取A、C列的值为空。目前没有从根本上找到原因,那就只能从程序的设计上去解决这个问题了。
通过EasyExcel读取目标文件
EasyExcel.read("D:\\Users\\admin\\Documents\\Tencent Files\\1430424583\\FileRecv\\demo.xls", new FaguiSheet()).sheet().doRead();
解决思路,如果A、C列值找不到了的话,就判定这是个跨行数据,就复用之前读取的数据,需要用一个Map集合去存储之前读取的有效数据。
ReadListener实现类
class FaguiSheet extends AnalysisEventListener<Map<Integer, String>> {
// 所有要插入的数据
private List<Zhifafaguiku20191202> datas = new ArrayList<>();
// 缓存上一次跨行数据的有效数据
private Map<Integer, String> preContent;
@Override
public void invoke(Map<Integer, String> o, AnalysisContext analysisContext) {
DemoModel model = new DemoModel();
String weifaxingwei = o.get(2);
String weifantiaokuan = o.get(3);
String chufayiju = o.get(4);
String weifachengdu = o.get(5);
String consequence = o.get(6);
String chufabiaozhun = o.get(7);
// 如果数据是空的话,从缓存对象中取值
if (StringUtils.isBlank(weifaxingwei)) {
weifaxingwei = preContent.get(2);
}
if (StringUtils.isBlank(weifantiaokuan)) {
weifantiaokuan = preContent.get(3);
}
if (StringUtils.isBlank(chufayiju)) {
chufayiju = preContent.get(4);
}
if (StringUtils.isBlank(weifachengdu)) {
weifachengdu = preContent.get(5);
}
if (StringUtils.isBlank(consequence)) {
consequence = preContent.get(6);
}
if (StringUtils.isBlank(chufabiaozhun)) {
chufabiaozhun = preContent.get(7);
}
model.setFaguibianhao(faguibianhao);
model.setWeifaxingwei(weifaxingwei);
model.setWeifantiaokuan(weifantiaokuan);
model.setChufayiju(chufayiju);
model.setWeifachengdu(weifachengdu);
model.setConsequence(consequence);
model.setChufabiaozhun(chufabiaozhun);
// 将数据放入list
datas.add(model);
// 复用跨行数据的实现
String uniqueKey = o.get(0);
// 如果A列的值为空,那么说明这是跨行列,如果取的值不是空,那说明这是第一次读取跨行列数据
// 如果preContent为空,说明这是第一次读取sheet表格的数据
if (!StringUtils.isBlank(uniqueKey) || preContent == null) {
preContent = o;
}
}
/**
* 表格数据解析完之后调用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
for (DemoModel model : datas) {
// 往数据库里插入数据
demoMapper.insertSelective(model);
}
}
}
数据插入成功
当前EasyExcel版本2.1.3,不知道后续版本会不会修复这个问题,先在这记录一下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构