springboot系列(二十八):如何实现excel携带图片导出?这你得会|超级详细,建议收藏
Posted bug菌¹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot系列(二十八):如何实现excel携带图片导出?这你得会|超级详细,建议收藏相关的知识,希望对你有一定的参考价值。
👨🎓 作者: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文件?
既然word的导出都实现了多样化,那数据上要是如果携带图片,excel导出该怎么办呢?
比如啊,导出所有用户的基本信息,而用户表中,就存有每一个用户的自画像,比如一寸照啥的,像这个情况,那excel导出应该得怎么实现呢?还是跟以前一样么??
接下来我就开始啦,同学们可得竖起耳朵好好听讲哦~我会带着大家一步一步实现它,至于怎么实现,接着往下看。
我们先来看一眼,跟着本文实现下来的最终效果。如下图所示:
所以,如果你们对此有任何的疑问点,那么我都会带着你从零到一的学会它,基本事例代码我都会贴上,目的就是帮助大家更好的核对实现不出效果的同学有个基本的对照。
二、引入pom依赖🔥
实现excel图片导出,我们还是得依赖于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的图片导出🔥
1️⃣定义导出实体类
我这里就教大家采用注解的方式来进行excel的导出,后续有时间再给大家讲解如何通过excel模板的形式导出,好吧。主要就是基于@Excel
注解来实现的。
具体实现代码大家请看下边,中途有些重点,我会在代码下方进行拓展讲解的,这点大家可以放心。
ExportExcelUser.java
/**
* excel导入user参数
*
* @author luoYong
* @version 1.0
* @date 2022/2/15 14:34
*/
@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;
//imageType 导出类型;1:从file读取;2:是从数据库中读取,默认是文件;同样导入也是一样的
@Excel(name = "头像", type = 2, width = 30.0, height = 30.0, imageType = 1)
private String image;
@Excel(name = "用户描述", width = 20.0)
private String describes;
拓展:
@Data
:该注解为Lombok提供,目的是为了省略手动添加get set方法。@Excel(databaseFormat="xxxx")
:如果数据库字段是string类型,则需要添加该属性,并加上该时间格式,比如:databaseFormat = "yyyyMMdd"。@Excel(format="xxxx")
:format属性为excel展示格式。@Excel(replace="xxx_0", "xxx_1","xxx_2",addressList = true)
:表示单元格下拉框展示,_0、_1表示下拉值的前后顺序,从0往后排。要实现字段下拉,addressList属性必不可少。@Excel(suffix="xxx")
:表示自动添加该xxx为你字段文字的后缀,比如:"98"-->98%。@Excel(imageType="xxx")
:表示导出类型,imageType=1:从file读取;imageType=2:从数据库中读取;默认是文件,同样导入也是一样的。
其余的注解说明就直接跳过了,想了解的可以去看我前几期的文章,特别是第一期准备篇《springboot集成Easypoi之准备篇》。
2️⃣Controller添加excel导出方法
我们先来定义一个excel导出方法,目的是提供一个口子,好方便自己通过浏览器访问进行测试。
/**
* excel批量用户导出
*/
@GetMapping("/export")
@ApiOperation(value = "excel批量用户导出", notes = "excel批量用户导出")
public void exportUsersToExcel(HttpServletResponse response)
userService.exportUsersToExcel(response);
3️⃣定义导入接口
/**
* excel批量用户导出
*/
void exportUsersToExcel(HttpServletResponse response);
4️⃣实现导出方法(核心)
如下这个导出实现类就很关键了,我们还是直接使用easypoi提供的exportExcel()
方法,详细使用请参考我写的:
代码具体设置如下:
/**
* excel批量用户导出
*/
@Overridepublic void exportUsersToExcel(HttpServletResponse response)
try
//从数据库查询到数据
List<UserEntity> users = this.list();
//设置信息头,告诉浏览器内容为excel类型
response.setHeader("content-Type", "application/vnd.ms-excel");
//设置下载名称
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("学生信息表.xls", StandardCharsets.UTF_8.name()));
//字节流输出
ServletOutputStream out = response.getOutputStream();
//设置excel参数
ExportParams params = new ExportParams();
//设置sheet名名称
params.setSheetName("学生列表");
//设置标题
params.setTitle("学生信息表");
//转成对应的类型;要不然会报错,虽然也可以导出成功
List<ExportExcelUser> exportUsers = this.changeType(users);
//导入excel
Workbook workbook = ExcelExportUtil.exportExcel(params, ExportExcelUser.class, exportUsers);
//写入
workbook.write(out);
catch (Exception e)
e.printStackTrace();
我由于是使用了mybatis-plus
指定了实体类型,所以为了将实体类型与导出vo类一致,我将简单写一个重新赋值给导出vo类即可。
代码具体设置如下:
/**
* 转成导出vo
*
* @param users
*/
private List<ExportExcelUser> changeType(List<UserEntity> users)
List<ExportExcelUser> res = new ArrayList<>();
for (UserEntity user : users)
ExportExcelUser exportUser = new ExportExcelUser(user);
res.add(exportUser);
return res;
很好奇,我的图片是怎么进行赋值的。那你看到 ExportExcelUser类了没,我肯定是进行构造体了啊,是吧,要不然写在实体类中,就有点难看了。
public ExportExcelUser(UserEntity user)
this.name = user.getName();
this.age = user.getAge();
this.address = user.getAddress();
this.sex = user.getSex();
this.describes = user.getDescribes();
//设置出生时间
this.bornDate = new Date();
//设置入学时间
this.enterSchoolTime = "20220210";
//正常情况是获取数据库中每个用户对象的头像地址 --> this.image = user.Img();
//设置一张图片地址;演示我就地址写死
this.image = "./template/image/刘亦菲.jpg";
注意:
- 我是直接在项目本地创建了一个
template/image
文件夹,然后写死了一张图片,所以接下来的剧情就是每个用户数据对应的都是这张图片啦。 - 留意对比一下
bornDate
与enterSchoolTime
这两个字段,一个传Date()类,一个传String。
5️⃣浏览器测试接口
我们打开浏览器,在地址栏,输入我们刚才在Controller暴露出来的接口地址:
比如我的:http://localhost:8080/user/export 你按你的接口地址进行访问即可。
输入完直接回车,可以看到有一个文件正在被下载,剩下的就看内容是否都被设置上了,特别是这期的重点,图片的导出。
如上图,基本都达到了要求,sheet命名,文档标题,然后就是对于性别字段,也展示了下拉框筛选,其次就是性别也自动添加了文字后缀;特别的是咱们的头像字段该列,图片都导出成了,这是值得开心的。
还有就是出生时间与入学时间,这两列,虽然数据类型不一样,但是都输出了”yyyy-MM-dd“指定的时间格式,对吧。
@Excel(name = "出生年月", format = "yyyy-MM-dd", width = 20.0)
private Date bornDate;
@Excel(name = "入学时间", databaseFormat = "yyyyMMdd", format = "yyyy-MM-dd", width = 20.0)
private String enterSchoolTime;
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携带图片导出?这你得会|超级详细,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章
springboot系列(二十八):如何实现excel携带图片导出?这你得会|超级详细,建议收藏
Spring Boot2 系列教程(二十) | SpringBoot 是如何实现日志的?
第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
springboot系列(二十三):如何实现Excel文件导入?这你得会 | 超级详细,建议收藏