
悟纤:师傅,那个讨人厌的产品又来捣乱了~ 😒

师傅:哈哈,你又来抱怨老板设定的无休止需求了啊? 😆

悟纤:没错,这次竟然要求导出多个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,看着这帅气的表格导出,我真的是太有才了~,在怎么复杂的需求也难不倒我了。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。









