问题描述
项目中用户要求根据自己的自定义导出数据。
例如:本来有 工作日,节假日,双休日 3个列
本来是可以直接写个对应实体类,设置三个导出列就可以了。
导出如下图:
此时,用户这是要增加一个 国庆节或其他节日。变成下图这种格式
这个国庆节只有当月有,我们又不可能总是去更改我们的导出实体类,所以我们只能设置动态导出。
动态导出实体类
构造导出项目的实体 entityTitleList
//************************************************************************//
// 有多少值班项目可以根据实际从数据库中查出来
List<String> dateList = new ArrayList<>();
dateList.add("工作日");
dateList.add("节假日" );
dateList.add("双休日");
dateList.add("国庆节");
// 查出当前月都有那些值班项目,从而生成动态表头列
List<ExcelExportEntity> entityTitleList = new ArrayList<>();
// 建造动态导出的列
//构造对象等同于@Excel
ExcelExportEntity excelentity = new ExcelExportEntity("姓名", "name");
excelentity.setNeedMerge(true);
entityTitleList.add(excelentity);
for(String str : dateList){
excelentity = new ExcelExportEntity(str, str);
List<ExcelExportEntity> temp = new ArrayList<>();
temp.add(new ExcelExportEntity("值班日期", str + "Day"));
temp.add(new ExcelExportEntity("总天数", str + "s"));
//构造List
excelentity.setList(temp);
entityTitleList.add(excelentity);
}
导出的数据格式的封装
// 最终存放的数据
List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
// 第一列姓名
String userName = "李梦";
Map<String, Object> stringObjectMapName = new HashMap<>();
stringObjectMapName.put("name", userName);
// 一个beanList [bean,bean]
// 每个bean中有对应的日期和类型
// 最终可根据自己的数据查询到该实际数据
List<ZbpbDate> zbpbDates = new ArrayList<>();
ZbpbDate zbpbDateNew = new ZbpbDate();
zbpbDateNew.setZbpbType("工作日").setZbpbDate("2023-10-07 00:00:00.0");
zbpbDates.add(zbpbDateNew);
zbpbDateNew = new ZbpbDate();
zbpbDateNew.setZbpbType("国庆节").setZbpbDate("2023-10-01 00:00:00.0");
zbpbDates.add(zbpbDateNew);
if(PlatformObjectUtils.isNotEmpty(zbpbDates)){
SimpleDateFormat sdf = new SimpleDateFormat("M月d日");
List<Map<String, Object>> listDateType = new ArrayList<>();
Map<String, Object> stringObjectMap = new HashMap<>();
for(ZbpbDate zbpbDate : zbpbDates){
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.s");
Date d = sdfDate.parse(zbpbDate.getZbpbDate());
String dateStr = sdf.format(d);
stringObjectMap.put(zbpbDate.getZbpbType() + "Day", PlatformObjectUtils.isEmpty(stringObjectMap.get(zbpbDate.getZbpbType() + "Day"))? dateStr:dateStr+ ","+stringObjectMap.get(zbpbDate.getZbpbType() + "Day"));
stringObjectMap.put(zbpbDate.getZbpbType() + "s", PlatformObjectUtils.isEmpty(stringObjectMap.get(zbpbDate.getZbpbType() + "s"))?1: (Integer)stringObjectMap.get(zbpbDate.getZbpbType() + "s")+ 1);
}
// 将对应的数据放到对应的map中
for(String s : dateList){
listDateType = new ArrayList<>();
Map<String, Object> stringObjectMapLocal = new HashMap<>();
stringObjectMapLocal.put(s+"Day",stringObjectMap.get(s+"Day")) ;
stringObjectMapLocal.put(s+"s",stringObjectMap.get(s+"s")) ;
listDateType.add(stringObjectMapLocal);
stringObjectMapName.put(s, listDateType);
}
}
listData.add(stringObjectMapName);
String tilte = "XX月值班统计表";
ExportParams exportParams = new ExportParams(tilte, "值班排班数据");
// 将entityTitleList放入导出的类型中
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityTitleList, listData);
workbook.createCellStyle().setLocked(true);
FileOutputStream fos = new FileOutputStream("E:/XX单位值班排班数据.xls");
workbook.write(fos);
fos.close();
}
导出图如下:
以上就是实现了动态的导出。
总结
1.以上功能的实现需要有个表存储动态的列。故此可以不用频繁改变代码从而实现动态导出列的增加。
2.以上功能实现是基于easypoi的map导出