autopoi(easypoi,jeecg,jeecgBoot) Excel導出ListMap 格式數據的源碼改造

本文討論的是在使用jeecg、jeecgboot框架,或單獨使用AutoPOI、Easy POI 導入導出組件情況下,數據格式爲List<Map>情況下的使用及源碼改造問題。

一、問題背景

項目是一個類似決策支持系統(都是一些報表圖表展示),採用了List<Map<String,String>>  這種數據結構(非在Entity上加註解這種用法)。項目採用Jeecg-Boot框架進行開發。

發現在複合表頭時候,實現起來有些麻煩。複合表頭指如下格式:

二、實現示例

Controller中,配置如下。重點關注表頭部分的代碼,即 List<ExcelExortEntity> filedsList部分。

	@RequestMapping(value = "/exportXls")
	public ModelAndView exportXls(HttpServletRequest request, JeecgOrderMain jeecgOrderMain) {
		//查詢數據
		List<Map<String, Object>> demoData = queryDate2();
		//導出Excel
		ModelAndView mv = new ModelAndView(new JeecgMapExcelView());
		// 導出文件名稱
		mv.addObject(MapExcelConstants.FILE_NAME, "Map導出多表頭示例");
		// 設置數據
		mv.addObject(MapExcelConstants.MAP_LIST, demoData); 
		// 設置 ExportParams
		mv.addObject(MapExcelConstants.PARAMS, new ExportParams("Map導出多表頭示例", "testExp"));
		
		// 設置表頭樣式
		List<ExcelExportEntity> filedsList = new ArrayList<>();
		filedsList.add(new ExcelExportEntity("姓名", "name"));
		filedsList.add(new ExcelExportEntity("性別", "sex"));
		filedsList.add(new ExcelExportEntity("年齡", "age"));
		ExcelExportEntity lover = new ExcelExportEntity("配偶","lover");
		List <ExcelExportEntity> loverFileds  = new ArrayList<>();
		loverFileds.add(new ExcelExportEntity("姓名","loverName"));
		loverFileds.add(new ExcelExportEntity("年齡","loverAge"));
		lover.setList(loverFileds);
		filedsList.add(lover);
		mv.addObject(MapExcelConstants.ENTITY_LIST, filedsList);
		return mv;
	}

模擬上述配置需要的數據,即上述代碼中的queryData1(),如下:

/**
	 * 模擬數據查詢
	 * @return List<Map<String,Object>>  Object中含有List
	 * */
	public  List<Map<String,Object>> queryDate2(){
		List<Map<String, Object>> demoData = new ArrayList<>();
		Map row1 = new HashMap<String,String>();
		row1.put("name", "張帥");
		row1.put("sex", "男");
		row1.put("age", "22");
		
		List<Map<String,String>> lover1 = new ArrayList<>();
		HashMap lover1Row1= new HashMap<String,String>();
		lover1Row1.put("loverName", "韓美");
		lover1Row1.put("loverAge", "23");
		lover1.add(lover1Row1);
		row1.put("lover", lover1);

		Map row2 = new HashMap<String,String>();
		row2.put("name", "張帥2");
		row2.put("sex", "男");
		row2.put("age", "32");

		List<Map<String,String>> lover2 = new ArrayList<>();
		HashMap lover2Row1= new HashMap<String,String>();
		lover2Row1.put("loverName", "韓美2");
		lover2Row1.put("loverAge", "33");
		lover2.add(lover2Row1);
		
		row2.put("lover", lover2);
		demoData.add(row1);
		demoData.add(row2);
		return demoData;
	}

三、問題出現

問題是上述的數據結構,其實真是的數據只是複合表頭,數據間還是一對一的數據,確切點沒有設置數據間的關係,返回的就是List<Map<Stirng,String>> 這種數據。如下,而框架不能直接使用這種數據格式。需要轉換成上面的數據格式。

	/**
	 * 模擬數據查詢
	 * @return List<Map<String,String>>
	 * */
	public  List<Map<String,Object>> queryDate1(){
		List<Map<String, Object>> demoData = new ArrayList<>();
		Map row1 = new HashMap<String,String>();
		row1.put("name", "張帥");
		row1.put("sex", "男");
		row1.put("age", "22");
		row1.put("loverName", "韓美");
		row1.put("loverAge", "23");

		Map row2 = new HashMap<String,String>();
		row2.put("name", "張帥2");
		row2.put("sex", "男");
		row2.put("age", "32");
		row2.put("loverName", "韓美2");
		row2.put("loverAge", "33");
		
		demoData.add(row1);
		demoData.add(row2);
		return demoData;
	}

四、源碼改造

下載源碼導入eclipse.

源碼地址:https://github.com/zhangdaiscott/autopoi

修改源碼地方一、ExcelExportEntity,增加一個屬性 

	
	/**
	 *  當本對象中的ExcelExportEntity list屬性有值且不爲空時生效,說明對應 數據是否爲List 
	 *  
	 *  add by xugj
	 *
	 */
	private boolean isListData = true;

	public boolean isListData() {
		return isListData;
	}

	public void setListData(boolean isListData) {
		this.isListData = isListData;
	}

修改源碼地方二、ExcelExportBase.java 中的createCells方法

修改完後執行mvn install,即可。

五、改造的使用界面

可以直接使用List<Map<String,String>> 格式的數據,而不用再轉換格式。只需要對複合表頭設置一下 isListData 爲false.

	@RequestMapping(value = "/exportXls")
	public ModelAndView exportXls(HttpServletRequest request, JeecgOrderMain jeecgOrderMain) {
		//查詢數據
		List<Map<String, Object>> demoData = queryDate1();
		//導出Excel
		ModelAndView mv = new ModelAndView(new JeecgMapExcelView());
		// 導出文件名稱
		mv.addObject(MapExcelConstants.FILE_NAME, "Map導出多表頭示例");
		// 設置數據
		mv.addObject(MapExcelConstants.MAP_LIST, demoData); 
		// 設置 ExportParams
		mv.addObject(MapExcelConstants.PARAMS, new ExportParams("Map導出多表頭示例", "testExp"));
		
		// 設置表頭樣式
		List<ExcelExportEntity> filedsList = new ArrayList<>();
		filedsList.add(new ExcelExportEntity("姓名", "name"));
		filedsList.add(new ExcelExportEntity("性別", "sex"));
		filedsList.add(new ExcelExportEntity("年齡", "age"));
		ExcelExportEntity lover = new ExcelExportEntity("配偶","lover");
		lover.setListData(false); // 這是重點
		List <ExcelExportEntity> loverFileds  = new ArrayList<>();
		loverFileds.add(new ExcelExportEntity("姓名","loverName"));
		loverFileds.add(new ExcelExportEntity("年齡","loverAge"));
		lover.setList(loverFileds);
		filedsList.add(lover);
		mv.addObject(MapExcelConstants.ENTITY_LIST, filedsList);
		return mv;
	}

改造完成,記錄一下。

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