悟纤:师傅,那个讨人厌的产品又来捣乱了~ 😒
师傅:哈哈,你又来抱怨老板设定的无休止需求了啊? 😆
悟纤:没错,这次竟然要求导出多个Sheet,这还能不能好好地活着了? 😩
师傅:放心,这个功能非常简单,像我这么菜的人都能实现呢,你肯定可以。 😎
悟纤:噢,那太好了,我就知道师傅最厉害啦! 😍
师傅:当然,聪明如我怎么会让你再加班到半夜9点呢?嘿嘿。 😏
悟纤:哈哈,师傅您真幽默,能不能再给点儿调侃? 😜
师傅:你想听笑话吗?产品经理说了句:“我不懂技术,但我知道这很困难。” 😂
悟纤:哈哈哈,笑死我了,这不是笑话,这是经典啊!🤣
师傅:还有,给你一个好消息,完成之后,今晚请你吃饭庆祝!🍣🍱
悟纤:耶!师傅最棒了!💃🏻
导读
在前面的几个小节中,介绍的都是单个Sheet的导出,在实际的项目中,希望导出多个Sheet的数据,如下的效果:
用户信息的sheet如下:
学生课程表的数据如下:
这里实现的效果实际上就是将前面讲到的两个数据表,原先导出的是两个Excel,然后这里导出了一个Excel多个Sheet的方式。
目前单Sheet和单Class的方式比较多,对于多Sheet的方式还是一片空白,这里做一下说明。
一、导出多Sheet分析
在前面ExcelUtil提供的方法中,有这么一个方法:
在这个方法中,接收的是一个List<Map<String,Object>> 这里特别像多Sheet的导出,一个Sheet就是一个Map<String,Object>,那么在一个Map中都需要进行什么key的设置呢?
跟进这个方法看一下,可以找到ExcelExportUtil.exportExcel的方法:
在这个方法中,可以看到这里for循环遍历了list对象,然后map中的key分别是title、entity、data。仔细一看,这些信息不就是导出单个excel需要的参数么,那么到这里我们大概就清楚了,就是将导出单个excel的信息,设置到Map中,然后就可以实现多Sheet的导出了。
二、导出多Sheet实操
接下来看下具体的代码逻辑。
2.1 添加用户sheet
首先定义多sheet对list对象:
List<Map<String, Object>> exportParamList = Lists.newArrayList();
模拟用户数据:
List<UserExportVO> users = new ArrayList<>();
users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",null,"公众号SpringBoot"));
users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",null,"公众号SpringBoot"));
配置sheet的map信息,根据上面的源码分析,主要是设置title、entity、data:
Map<String, Object> sheetMap = Maps.newHashMap();
sheetMap.put("title",new ExportParams("用户数据", "用户信息"));
sheetMap.put("entity",UserExportVO.class);
sheetMap.put("data",users);
将该sheet map信息添加到list对象中:
exportParamList.add(sheetMap);
自此已经添加了一个sheet了。
2.2 添加用户课程-学生sheet
接下来将课程-学生的数据添加进来,构造学生、老师、课程表的数据信息:
//1. 学生数据
List<StudentExportVO> students1 = new ArrayList<>();
students1.add(new StudentExportVO("001","悟纤",1,new Date()));
students1.add(new StudentExportVO("002","刘亦菲",0,new Date()));
students1.add(new StudentExportVO("003","赵丽颖",0,new Date()));
List<StudentExportVO> students2 = new ArrayList<>();
students2.add(new StudentExportVO("001","刘诗诗",1,new Date()));
students2.add(new StudentExportVO("002","迪丽热巴",0,new Date()));
students2.add(new StudentExportVO("003","杨幂",0,new Date()));
//2.老师数据.
TeacherExportVO teacher1 = new TeacherExportVO("林老师");
TeacherExportVO teacher2 = new TeacherExportVO("王老师");
//3.课程数据以及关联数据.
List<CourseExportVO> courseList = new ArrayList<>();
courseList.add(new CourseExportVO("数学",teacher1,students1));
courseList.add(new CourseExportVO("语文",teacher2,students2));
配置sheet的map信息:
sheetMap= Maps.newHashMap();
sheetMap.put("title",new ExportParams("学生数据", "学生课程表"));
sheetMap.put("entity",CourseExportVO.class);
sheetMap.put("data",courseList);
将该sheet map信息添加到list对象中:
exportParamList.add(sheetMap);
自此又添加了一个sheet了。
最后执行导出代码:
ExcelUtil.exportExcel(exportParamList,"数据汇总导出.xlsx",response);
以上整个的代码如下:
@GetMapping("/exportExcel2")
public void exportExcel2(HttpServletResponse response) throws IOException {
//多sheet对list对象
List<Map<String, Object>> exportParamList = Lists.newArrayList();
// 模拟数据
List<UserExportVO> users = new ArrayList<>();
users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",null,"公众号SpringBoot"));
users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",null,"公众号SpringBoot"));
Map<String, Object> sheetMap = Maps.newHashMap();
sheetMap.put("title",new ExportParams("用户数据", "用户信息"));
sheetMap.put("entity",UserExportVO.class);
sheetMap.put("data",users);
exportParamList.add(sheetMap);
// ========== 模拟数据
//1. 学生数据
List<StudentExportVO> students1 = new ArrayList<>();
students1.add(new StudentExportVO("001","悟纤",1,new Date()));
students1.add(new StudentExportVO("002","刘亦菲",0,new Date()));
students1.add(new StudentExportVO("003","赵丽颖",0,new Date()));
List<StudentExportVO> students2 = new ArrayList<>();
students2.add(new StudentExportVO("001","刘诗诗",1,new Date()));
students2.add(new StudentExportVO("002","迪丽热巴",0,new Date()));
students2.add(new StudentExportVO("003","杨幂",0,new Date()));
//2.老师数据.
TeacherExportVO teacher1 = new TeacherExportVO("林老师");
TeacherExportVO teacher2 = new TeacherExportVO("王老师");
//3.课程数据以及关联数据.
List<CourseExportVO> courseList = new ArrayList<>();
courseList.add(new CourseExportVO("数学",teacher1,students1));
courseList.add(new CourseExportVO("语文",teacher2,students2));
sheetMap= Maps.newHashMap();
sheetMap.put("title",new ExportParams("学生数据", "学生课程表"));
sheetMap.put("entity",CourseExportVO.class);
sheetMap.put("data",courseList);
exportParamList.add(sheetMap);
ExcelUtil.exportExcel(exportParamList,"数据汇总导出.xlsx",response);
}
运行代码,进行测试:
So wonderful,看着这帅气的表格导出,我真的是太有才了~,在怎么复杂的需求也难不倒我了。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。