之前小小的接觸過easyExcel,代替了傳統的poi,上次使用的時候,表頭比較傳統,也不復雜,但是這次呢表頭稍微有點複雜,讀取數據要從指定的位置開始,要從指定位置開始讀取easyExcel,所以呢在不斷的摸索之後,找到了合適的解決方法。
大佬請繞道,此次記錄主要是爲了自己下次方便查看。
1.先看下我的表頭,如下圖:1-5行都是表頭
要開始讀取數據,第6行纔是真正的數據,直接上代碼,看下圖標紅的地方,headRowNumber(),不寫默認是1,即就是從第二行開始讀數據。
2. 說下導入數據的流程:
1.)表頭校驗: invokeHeadMap()方法。
/**
* @param headMap 傳入excel頭部(第一行數據)數據的index,name
* 校驗excel頭部格式,必須完全匹配
*/
int x=0;
@Override
public void invokeHeadMap(Map<Integer,String> headMap,AnalysisContext context) {
x++;
super.invokeHeadMap(headMap, context);
System.out.println(headMap.size());
if(x==3 && headMap.size()!=20) {
teamList.add("解析Excel出錯,請傳入正確模板的Excel");
}
}
2.)一條一條數據解析 invoke()方法 ,方法裏面是我業務邏輯,數據校驗。MedBatchDetailsPerExcel 就是每行具體的數據值
/**
* 這個每一條數據解析的時候都回來調用
*/
List<MedBatchDetailsPer> medBatchDetailsList = new ArrayList<>();//要導入的數據
List<MedBatchDetailsPer> medBatchDetailsList3=null;
@Override
public void invoke(MedBatchDetailsPerExcel data, AnalysisContext context) {
log.info("解析到一條數據:{}",JSON.toJSONString(data));
total++;
Integer rowIndex=context.readRowHolder().getRowIndex()+1;//+1行(實際中excel中第幾行的數據)
MedBatchDetailsPer medBatchDetailsPer=importDataCheck1(data,rowIndex);
importDataCheck(data,rowIndex);
List<MedBatchDetailsPer> medBatchDetailsList2 =repeatImportCheck(data,rowIndex);//重複導入校驗
if (medBatchDetailsList2 != null && medBatchDetailsList2.size() > 0) {
medBatchDetailsList3.addAll(medBatchDetailsList2);
}
medBatchDetailsList.add(medBatchDetailsPer);
}
3.)所有數據解析完, doAfterAllAnalysed()方法,裏面寫的有保存數據方法。
/**
* 所有數據解析都完成之後,調用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 這裏也要保存數據,確保最後遺留的數據也存儲到數據庫
insertAllData(empId,medBatchDetailsList.size(),medBatchDetailsList,medBatchDetailsList3);
log.info("所有數據都解析完成!");
}
easyExcel步驟就這幾步,具體業務邏輯不一樣,只是個敲~~~此次主要記錄複雜表頭的導入,讀取。