悟纤:师傅,那个讨人厌的产品又来捣乱了~ 😒
师傅:哈哈,你又来抱怨老板设定的无休止需求了啊? 😆
悟纤:没错,这次竟然要求导出多个Sheet,这还能不能好好地活着了? 😩
师傅:放心,这个功能非常简单,像我这么菜的人都能实现呢,你肯定可以。 😎
悟纤:噢,那太好了,我就知道师傅最厉害啦! 😍
师傅:当然,聪明如我怎么会让你再加班到半夜9点呢?嘿嘿。 😏
悟纤:哈哈,师傅您真幽默,能不能再给点儿调侃? 😜
师傅:你想听笑话吗?产品经理说了句:“我不懂技术,但我知道这很困难。” 😂
悟纤:哈哈哈,笑死我了,这不是笑话,这是经典啊!🤣
师傅:还有,给你一个好消息,完成之后,今晚请你吃饭庆祝!🍣🍱
悟纤:耶!师傅最棒了!💃🏻
导读
在前面的几个小节中,介绍的都是单个Sheet的导出,在实际的项目中,希望导出多个Sheet的数据,如下的效果:
用户信息的sheet如下:
学生课程表的数据如下:
这里实现的效果实际上就是将前面讲到的两个数据表,原先导出的是两个Excel,然后这里导出了一个Excel多个Sheet的方式。
目前单Sheet和单Class的方式比较多,对于多Sheet的方式还是一片空白,这里做一下说明。
特别说明:本节的例子的导出实体类是基于前面的章节的实体类进行使用的,所以看的有点蒙圈的小伙伴可以查看前面的文章:
👇🏻👇🏻👇🏻EasyPoi实战系列:
01.《【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇》
02.《【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇》
03.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇》
一、导出多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,看着这帅气的表格导出,我真的是太有才了~,在怎么复杂的需求也难不倒我了。
「关注我不迷路,带你探索新技术」
我是一名热爱技术、分享经验的 IT 从业者。如果您也热爱计算机、喜欢编程、探寻新技术,那么我们一定会成为好朋友!我的微信号是 [wuqian5268],如果你想随时和我交流、讨论技术或者了解我最新的项目和成果,请不要犹豫,立即扫码或者添加我吧!
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7