本文讨论的是在使用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;
}
改造完成,记录一下。