springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏
Posted bug菌¹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏相关的知识,希望对你有一定的参考价值。
👨🎓 作者:bug菌
🎉简介:在CSDN、掘金等社区优质创作者,全网合计6w粉+,对一切技术都感兴趣,重心偏java方向,目前运营公众号[猿圈奇妙屋],欢迎小伙伴们的加入,一起秃头。
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!
小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章 点亮👍吧,您的点赞三连( 收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,创作不停💕,加油☘️
一、前言🔥
前几期呢,我们主要是讲了如何集成easypoi实现excel的导入导出功能,word的导入导出,对吧。不知道你们掌握的如何,如果还对以下任意一篇有疑问,还请大家多多提问,哈哈哈,虽然不是什么大佬,但是我会尽全力相授,一起学习查缺补漏。
- springboot集成EasyPoi(环境准备篇)
- 如何实现Excel文件的导入?
- 如何实现Excel文件的导出?
- 如何实现单word文档模板分页导出?
- 如何实现word文件模板导出单页?
- 如何实现word文件带图片导出?
- 如何实现excel文件带图片导出?
- 如何实现excel文件多sheet导入?
- 如何实现excel文件多sheet导出?
- 如何实现excel模板导出成pdf文件?
在前几期我们是学习了以上内容,比如如何实现excel单sheet的导入导出,excel多sheet的导入等,谈及多sheet组导入,那肯定会想到如何实现多sheet组的导出?哈哈哈,肯定有办法进行针对多sheet表的导出。上一期我们是重点讲解了如何集成easypoi进行excel表多sheet工作表的导入,所以这期与上一期相呼应,bug菌这就来给大家讲讲如何通过easypoi实现多sheet表的excel导出。
别担心,我今天就是带着大家从零敲一遍,希望大家都能提前备好课,届时如果在项目中真遇到了这个需求,那你肯定会是全场最靓的仔。
"这个需求很简单,我几分钟给你搞定。"
接下来我就开始啦,同学们可得竖起耳朵好好听讲哦~我会带着大家一步一步实现它,至于怎么实现,接着往下看。
二、环境配置🔥
实现excel多sheet工作表的导入导出功能,我们还是得依赖于easypoi来做。所以你们只需要在你们的pom.xml依赖中加上如下easypoi的starter依赖包即可,添加过的同学就可以不用再重复导入了。
<!--easypoi依赖,excel导入导出-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
三、实战演示🔥
如下我们先分别来定义两个excel导出vo,目的是为了让大家看清,分不同的sheet存放不同的数据。届时后边也需要用到的,毕竟对应不同的vo进行导出。
1️⃣定义导入vo
ExportExcelLog.java
@Data
public class ExportExcelLog implements Serializable
private static final long serialVersionUID = 1L;
/**
* @Excel 作用在一个filed上面,对列的描述
* @param name 列名
* @param orderNum 下标,从0开始。
*/
@Excel(name = "url", width = 20.0)
private String url;
@Excel(name = "ip", width = 20.0)
private String ip;
//字段是Date类型则不需要设置databaseFormat
@Excel(name = "请求时间", format = "yyyy-MM-dd", width = 20.0)
private Date operationTime;
@Excel(name = "接口返回状态码", width = 20.0)
private int code;
ExportExcelUser.java
@Data
public class ExportExcelUser implements Serializable
private static final long serialVersionUID = 1L;
/**
* @Excel 作用在一个filed上面,对列的描述
* @param name 列名
* @param orderNum 下标,从0开始。
*/
@Excel(name = "姓名", width = 10.0)
private String name;
@Excel(name = "年龄", width = 10.0)
private Integer age;
//字段是Date类型则不需要设置databaseFormat
@Excel(name = "出生年月", format = "yyyy-MM-dd", width = 20.0)
private Date bornDate;
//如果数据库如果是string类型,这个需要设置这个数据库时间格式 format:输出时间格式
@Excel(name = "入学时间", databaseFormat = "yyyyMMdd", format = "yyyy-MM-dd", width = 20.0)
private String enterSchoolTime;
//replace:单元格下拉框,_0表示下拉顺序 suffix:文字后缀 比如:男->男生
@Excel(name = "性别", width = 10.0, replace = "男_0", "女_1", suffix = "生", addressList = true)
private String sex;
@Excel(name = "地址", width = 30.0)
private String address;
@Excel(name = "头像", type = 2, width = 30.0, height = 30.0, imageType = 1)
private String image;
@Excel(name = "用户描述", width = 20.0)
private String describes;
如上我是分别定义了user跟logInfo类,你们也可以随便可以那两个实体进行定义,这个不一定非要跟我一样的。
2️⃣Controller添加excel导入方法
接下来,我们定义一个excel导出方法,目的是提供一个口子,好方便自己通过浏览器访问进行测试代码的完整性。
具体代码实现如下:
/**
* excel多sheet导出
*/
@GetMapping("/export-for-sheets")
@ApiOperation(value = "excel多sheet导出", notes = "excel多sheet导出")
public void exportSheetUsers(HttpServletResponse response)
userService.exportSheetUsers(response);
3️⃣定义导入接口
/**
* excel多sheet导出
*/
void exportSheetUsers(HttpServletResponse response);
4️⃣实现导入方法(核心)
整篇文的核心就在于此了,主要是要理解怎么按照步骤进行数据封装,然后使用那个excel导出方法,其他的跟你导出excel单sheet是一样的。
具体实现代码如下:
UserServiceImpl.java
/**
* excel多sheet导出
*/
@Override
public void exportSheetUsers(HttpServletResponse response)
//功能描述:把同一个表格多个sheet测试结果重新输出,
Workbook workBook = null;
try
// 创建参数对象(用来设定excel的sheet1内容等信息)
ExportParams userExportParams = new ExportParams();
// 设置sheet得名称
userExportParams.setSheetName("用户表");
// 设置sheet表头名称
userExportParams.setTitle("用户列表");
// 创建sheet1使用得map
Map<String, Object> userExportMap = new HashMap<>();
// title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
userExportMap.put("title", userExportParams);
// 模版导出对应得实体类型
userExportMap.put("entity", ExportExcelUser.class);
//转成导出vo类型
List<ExportExcelUser> users = this.changeType(this.list());
// sheet1中要填充得数据
userExportMap.put("data", users);
// 创建参数对象(用来设定excel的sheet2内容等信息)
ExportParams logInfoExportParams = new ExportParams();
logInfoExportParams.setTitle("日志列表");
logInfoExportParams.setSheetName("日志表");
// 创建sheet2使用的map
Map<String, Object> logInfoExportMap = new HashMap<>();
logInfoExportMap.put("title", logInfoExportParams);
logInfoExportMap.put("entity", ExportExcelLog.class);
//查询log数据
List<LogInfo> logInfoEntitys = logInfoMapper.selectList(new QueryWrapper<>());
//转成导出vo类型
List<ExportExcelLog> logInfos = this.changeInfoType(logInfoEntitys);
// sheet2中要填充得数据
logInfoExportMap.put("data", logInfos);
// 将sheet1、sheet2使用得map进行包装
List<Map<String, Object>> sheetsList = new ArrayList<>();
//后续增加sheet组,则后面继续追加即可;
sheetsList.add(userExportMap);
sheetsList.add(logInfoExportMap);
// 执行方法
workBook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
//设置编码格式
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
//设置内容类型
response.setContentType("application/octet-stream");
//设置头及文件命名。
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户及操作日志导出.xls", StandardCharsets.UTF_8.name()));
//写出流
workBook.write(response.getOutputStream());
catch (Exception e)
e.printStackTrace();
finally
if (workBook != null)
try
//强行关流
workBook.close();
catch (IOException e)
e.printStackTrace();
这里,我们先来进行断点一下,主要是想看一下,我们所赋值的数据是否被添加进去。
如下截图,很明显我们可以看到数据都有被put进去。数据是存放在data中的。总共分两个sheet,所有数组size = 2。
以上,有几点我要特别解释一下:
- 查看
exportExcel(List<Map<String, Object>> list, ExcelType type)
方法可得知,进行map.put(),其中的key必须是"title
","entity
"和"data
"。已经可以在源码方法可进行查看,所以设置参数类型等,都得按照这仨个key_name 进行put赋值。
- 分几个sheet就得封装几个
Map<String, Object>
,然后再将map添加进List<Map<String, Object>>
中即可。
5️⃣浏览器测试接口
接下来,万事俱备,只欠东风啦,我们只需要进行对接口进行访问,一试便知,你的接口代码是否有问题,目前就是自己也不是很笃定自己写的就一定没问题,所以对于导出接口,最好的方式就是直接通过浏览器进行导出调用,在浏览器地址栏,输入:http://localhost:8080/user/export-for-sheets,你就按你定义的访问接口地址进行访问即可。
很明显, 可以正常导出,一看458kb大小,可想而知,数据内容肯定是有的,关键就是是否有数据分sheet表分?这得打个问题,等待会儿,下载好打开一看便知。
导出excel实际截图:
如下是sheet1导出的实际数据,很明显,与自己设置的导出vo设置是完全一致的。说明sheet1导出数据功能是没有问题。
接下来就是切换到sheet2查看了,看看是否数据、字段、标题是否都被设置上。
看如上截图,很明显啊,在一个excel中,成功将不同的数据导出到了同一个excel中的两个sheet表中,这点是值得庆幸的,哈哈哈哈,毕竟我也害怕导出效果差人强意,误人子弟,还好,基本达到了本期重点教学内容的实现要求了,所以,如果对屏幕前的你而言,看到这里,还等什么,赶紧给bug菌一个赞吧,实在是太强了,哈哈哈哈,算这几期内容中,比较难的知识点了。
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~
四、往期推荐🔥
- springboot系列(一):如何创建springboot项目及启动
- springboot系列(三):多环境切换,实例演示
- springboot系列(四):stater入门
- springboot系列(五):史上最最最全springboot常用注解
- springboot系列(六):mysql配置及数据库查询
- springboot系列(七):如何通过mybatis-plus实现接口增删改查
- springboot系列(八):mybatis-plus之条件构造器使用手册
- springboot系列(九):mybatis-plus之如何自定义sql
- springboot系列(十):mybatis之xml映射文件>、<=等特殊符号写法
- springboot系列(十一):实现多数据源配置,开箱即用
- springboot系列(十二):如何实现邮件发送提醒,你一定得会(准备篇)
- springboot系列(十三):如何实现发送普通邮件?你一定得会
- springboot系列(十四):如何实现发送图片、doc文档等附件邮件?你一定得会
- springboot系列(十五):如何实现静态邮件模板发送?你一定得会
- springboot系列(十六):如何实现发送邮件提醒,附完整源码
- springboot系列(十七):集成在线接口文档Swagger2
- springboot系列(十八):如何Windows安装redis?你玩过么
- springboot系列(十九):如何集成redis?不会我教你
- springboot系列(二十):如何通过redis实现手机号验证码功能
- ... ...
五、文末🔥
如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
最后送大家两句我很喜欢的话,与诸君共勉!
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start。
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。
💌如果文章对您有所帮助,就请留下您的赞吧!(#^.^#);
💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果对文章有任何疑问,还请文末留言或者加群吧;
💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);
💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。
以上是关于springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章
springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏
springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏
springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏
springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏