【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

news2024/11/28 20:52:39

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

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

悟纤:没错,这次竟然要求导出多个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十九、Sleuth整合Zipkin链路跟踪

目录 链路跟踪概述 SpringCloud Sleuth 1、架构图 2、主要概念 2.1、跟踪&#xff1a;Trace (一条完整链路--包含很多span(微服务接口)) 2.2、跨度&#xff1a;Span 2.3、标注&#xff1a;Annotation Sleuth整合Zipkin实现分布式链路跟踪 1、搭建zipkin环境 1.1、下载…

2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

路漫漫其修远兮&#xff0c;吾将上下而求索。 2023年5月的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有262个数据库参与排名。本月排行榜前十变动较大&#xff0c;可以用一句话概括为&#xff1a;openGauss 立足创新夺探花&#xff1b;华为云GaussDB 云上之争成赢…

单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

想要更多项目私wo!!! 一、电路设计 室内环境智能监测系统 主要功能: 1.检测空气温湿度 2.检测光照强度 3.检测烟雾浓度 4.数据显示在手机端和设备OLED屏幕上 5.当空气温度高于设定的阈值时&#xff0c;风扇开启 6.当空气湿度…

【Linux从入门到精通】上下文概念详解

上篇文章&#xff08;进程的基本概念&#xff09;我们讲解了进程后&#xff0c;还留下了一个上下文数据概念还没有解释。本篇文章会对上下文概念进行详解。在理解上下文概念时&#xff0c;同时会引出很多新的概念。我们都会对此进行详细解释&#xff0c;希望本篇文章会对你有所…

7款产品经理必备的交互软件

作为UI/UX设计师&#xff0c;我相信你或多或少接触过很多交互设计软件。 为您整理总结了几款流行的交互软件。如果您在上述交互设计软件中确实存在选择困难&#xff0c;希望通过阅读本文帮助您快速做出正确的选择。 即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不…

redis从零开始(1)----基本类型:string/hash/list

认识redis NoSQL Nosql not only sql&#xff0c;泛指非关系型数据库&#xff0c;与之相对的是RDBMS(Relational Database Management System)&#xff0c;即关系型数据库 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff…

企业有必要对三方应用进行安全管控吗?

什么是三方应用&#xff1f; 三方应用是指由第三方开发者创建的软件应用程序&#xff0c;与操作系统或其他主要平台的开发公司无关。这些应用程序通常被设计为在特定平台上运行&#xff0c;并且具有特定的功能或服务&#xff0c;例如社交媒体应用程序、游戏和生产力工具等。 简…

IntersectionObserver“替代”滚动条监听

概要 IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的方法。其祖先元素或视口被称为根&#xff08;root&#xff09;。 当一个 IntersectionObserver 对象被创建时&#xff0c;其被配置为监听根中…

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Aho-Corasick automaton,ac自动机实现

文章目录 写在前面算法概述trie树的构建trie树的节点结构插入P串到trie树中fail指针的创建 搜索过程测试程序 写在前面 原作者的视频讲解链接&#xff1a;[算法]轻松掌握ac自动机_哔哩哔哩_bilibili 原作者的代码实现&#xff1a;data-structure-and-algorithm/aho_corasick.c…

机器视觉表面划痕检测流程

表面缺陷检测常见的检测主要有物体表面的划痕、污渍、缺口、平面度、破损、边框对齐度、物体表面的亮度、皱纹、斑点、孔等。 表面缺陷检测设备凝聚了机器视觉领域的许多技术成果&#xff0c;吸取了许多创新的检测理念&#xff0c;可以与现有生产线无缝对接检测&#xff0c;也…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目&#xff0c;与各项目干系人没有建立有效的联系&#xff0c;他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识&#xff0c;而只管自己那一部分&#xff0c;整个开发过程完全是一种黑盒模式&#xff0c;项目组…

电视盒子哪个好?内行盘点2023最具性价比电视盒子推荐

电视盒子跟有线机顶盒相比不用每年缴费&#xff0c;资源也更丰富&#xff0c;可下载各种APP。作为电视盒子从业人员&#xff0c;身边亲友在选购电视盒子之前会咨询我的意见&#xff0c;不懂电视盒子哪个好&#xff0c;可以看看我总结的2023最具性价比电视盒子推荐&#xff0c;非…

手慢无,阿里巴巴最新出品的高并发终极笔记到底有多强?

前几天收到一位粉丝私信&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式&#xff0c;高并发&#xff0c;多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初…

MySQL-图形化界面工具 (下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

springboot+mybatis+redis实现二级缓存

Mybatis提供了对缓存的支持&#xff0c;分为一级缓存和二级缓存&#xff0c;其查询顺序为&#xff1a;二级缓存>一级缓存->数据库&#xff0c;最原始是直接查询数据库&#xff0c;为了提高效率和节省资源&#xff0c;引入了一级缓存&#xff0c;为了进一步提高效率&#…

计算机网络(四下)——网络层

接上篇&#xff0c;这篇文章主要来写路由选择 五、路由协议 1>动态路由 1.距离向量算法&#xff08;RIP协议&#xff09;&#xff1b;适用于小型网络 1》规定&#xff1a; 1>记录跳数(Hop count)最少的路径。 2>RIP允许一条路由最多15个路由器&#xff0c;距离为…

LitCTF2023 wp re最后一道 cry misc

本来不打算放了&#xff0c;但是比赛打都打了留个纪念社工有佬&#xff0c;与我无关&#xff0c;misc只会隐写虽然我是逆向手&#xff0c;但因为队友tql&#xff0c;所以只留给我最后一道~~我的wp向来以简述思路为主&#xff0c;习惯就好 Crypto Hex&#xff1f;Hex&#xff…

【项目设计】 负载均衡在线OJ系统

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录 一、项目介绍项目技术栈和开发环境 二、项目的宏观结构三、compile_server模块①日志模块开发&#xff0c;Util工具类&#xff0c;供所以模…

NVIDIA再现谜之刀法,RTX 4060Ti新增16G版

随着上一代库存逐渐清理到位&#xff0c;苏妈与老黄终于要把新一代主流级显卡掏出来了。 根据外网消息&#xff0c;AMD 这边主要是 RX 7600XT 与 7600 等型号&#xff0c;发布日期定为 5 月 25 日。 AMD 保密措施做得挺到位的&#xff0c;目前除了部分厂商爆出的包装与产品图…