EasyExcel從指定位置開始讀數據

之前小小的接觸過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步驟就這幾步,具體業務邏輯不一樣,只是個敲~~~此次主要記錄複雜表頭的導入,讀取。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章