目標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,不知道后續版本會不會修復這個問題,先在這記錄一下