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表中进行数据的导入或导出,但是真实环境肯定会不止一个sheet工作表,如果涉及多个sheet表在一张excel中,那么excel的导入导出功能,你们都玩过么?假设现在的需求就是要你读取一张excel表中的数据进行数据的导入,以及根据不同的sheet工作表进行数据的导出,这两个需求,要求你们最快实现,越快越好!哈哈哈哈,完蛋,好强烈的工作模式,是滴,没错,这就是战场,这就是实战。
别担心,我今天就是带着大家从零敲一遍,希望大家能提前备好课,届时如果真遇到了这个需求,那你肯定是全场最靓的仔。
接下来我就开始啦,同学们可得竖起耳朵好好听讲哦~我会带着大家一步一步实现它,至于怎么实现,接着往下看。
二、环境配置🔥
实现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>
三、实战演示🔥
1️⃣定义导入vo
/**
* excel导入user参数
*
* @author luoYong
* @version 1.0
* @date 2022/2/15 14:34
*/
@Data
public class ImportUser implements Serializable
private static final long serialVersionUID = 1L;
/**
* @Excel 作用在一个filed上面,对列的描述
* @param name 列名
* @param orderNum 下标,从0开始。
*/
@Excel(name = "姓名", orderNum = "0",width = 10.0)
private String name;
@Excel(name = "年龄", orderNum = "1",width = 10.0)
private Integer age;
@Excel(name = "性别", orderNum = "2",width = 5.0)
private String sex;
@Excel(name = "地址", orderNum = "3",width = 30.0)
private String address;
@Excel(name = "用户描述", orderNum = "4",width = 20.0)
private String describes;
2️⃣Controller添加excel导入方法
我们先来定义一个excel导入方法,目的是提供一个口子,好方便自己通过浏览器访问进行测试。
/**
* excel多sheet导入
*/
@GetMapping("/import-for-sheets")
@ApiOperation(value = "excel多sheet导入", notes = "excel多sheet导入")
public void importForSheetUsers(@RequestParam("file") MultipartFile file) throws IOException
userService.importForSheetUsers(file);
3️⃣定义导入接口
/**
* excel多sheet导入
*/
void importForSheetUsers(MultipartFile file) throws IOException;
4️⃣实现导入方法(核心)
如下这个导入实现类就很关键了,我们还是直接使用easypoi提供的importExcel()
方法,讲到这里,我就可以告诉大家ImportParams()
有提供一个startSheetIndex
属性,目的就是指定sheet工作表,所以我们就可以在excel导入方法的方式上再指定该sheet表即可,默认sheet是从下标0开始。
即我们就可以封装出一个excel导入方法了,这样不管是单sheet还是多sheet表都适用。
详细使用请参考我写的:
EasyPoiUtils.java
package com.example.demo.util;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import java.io.InputStream;import java.util.List;
import java.util.NoSuchElementException;
/**
* @author luoYong
* @version 1.0
* @date 2022/2/21 10:40
*/
public class EasyPoiUtils
/**
* 功能描述:根据接收的Excel文件来导入多个sheet,根据索引可返回一个集合
*
* @param inputStream excel输入流
* @param sheetIndex 导入sheet索引
* @param titleRows 表标题的行数
* @param headerRows 表头行数
* @param pojoClass Excel实体类
*/
public static <T> List<T> importExcel(InputStream inputStream, int sheetIndex, Integer titleRows, Integer headerRows, Class<T> pojoClass)
// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有几个sheet页
ImportParams params = new ImportParams();
// 第几个sheet表页
params.setStartSheetIndex(sheetIndex);
//设置表标题行数
params.setTitleRows(titleRows);
//设置表头行数
params.setHeadRows(headerRows);
List<T> list = null;
try
//读取的excel数据集合
list = ExcelImportUtil.importExcel(inputStream, pojoClass, params);
catch (NoSuchElementException e)
throw new RuntimeException("模板不能为空");
catch (Exception e)
e.printStackTrace();
return list;
以上就是对exce读取多sheet实现的封装,剩下的就好办了,我们的实际业务有几个sheet就连续调用几次即可,然后就是把读取到的数据进行进行的表插入。
由于我这里只是为了演示图方便,就没有制定几个不同的导入类,而都是使用了同一个ImportUser
,一般情况下,不同的sheet表一般对应的都是不同的数据内容,从多sheet表导入功能才被需要,这样一来省略每次的制定excel表的时间,提高了excel导入的拓展性与高效性,否则每导入一种excel就需要开发一个接口,这肯定是不被允许的,你们大家想想是不是?
UserServiceImpl.java
/**
* excel多sheet导入
*/
@Override
public void importForSheetUsers(MultipartFile file) throws IOException
//分批进行读取excel的sheet工作表
//读取第一个sheet表
List<ImportUser> sheetOneUsers = EasyPoiUtils.importExcel(file.getInputStream(), 0, 1, 1, ImportUser.class);
//读取第二个sheet表
List<ImportUser> sheetTwoUsers = EasyPoiUtils.importExcel(file.getInputStream(), 1, 1, 1, ImportUser.class);
//批量插入
this.saveUsers(sheetOneUsers);
this.saveUsers(sheetTwoUsers);
如下是对用户数据进行插入的方法,我这里也贴一下吧,我是集成了mybatis-plus组件,所以针对单表操作还是很有好的,需要的小伙伴可以翻我前几期集成mybatis-plus组件的文章,手把手教学,一遍就会。
/**
* 批量插入用户数据
*/
private boolean saveUsers(List<ImportUser> users)
//存放user
List<UserEntity> userList = new ArrayList<>();
//转成user实体
for (ImportUser user : users)
//验空
if (user != null)
UserEntity userEntity = new UserEntity(user);
userList.add(userEntity);
//批量插入
return this.saveBatch(userList);
5️⃣postman测试接口
由于要测试接口入参为MultipartFile
类,所以常规接口调用肯定不行,比如用swagger或者直接浏览器地址,所以这里我就推荐大家使用Postman工具,若是没有安装的,直接官网下载一个,一键安装即可,然后使用起来你只需要跟我下方截图一样即可。按照你指定的接口填好对应的接口地址及选好请求方式,然后就是file参数选择file文件类,传入你创建的excel模板文件,最后点击Send 即可。
实际截图如下:供大家参考。
调用完毕之后,由于无返回值且也没有500代码报错,查看下控制台是否有报错,最后就是验证数据库数据是否有被插入即可,这也是最直接最关键的验证步骤了,成功是否就在于此了,虽然很明显控制台sql打印了执行语句,其实就验证了数据进行了insert,但是我给大家进行代码演示就必须透明给大家,一一得到验证才是最好的教学,你们觉得呢?
如上图数据库表截图所示,查看了该项目所指定的数据库user表,很明显我们制定在excel中两个sheet表中的用户数据都insert进来了,这就验证了一件事,我们进行多sheet工作表excel导入功能点,所有代码已测试无误,大家尽可放心拿去学习或者直接cv使用啦。
注意:
如果你有遇到会插入空白数据的情况,我教你怎么去除,第一你先debug断点看实际读取到的excel数据size(total)是多少,然后有效数据(sj)是多少,做个减法(total-sj = n),表示有n条空数据,也就是你在excel有效数据的下方有n行是空行,可能是你填写了虽然肉眼看着是空,其实在读取的时候还是可以读取上的。物理法就是你只需要选中有效数据下方这n行,行删除且保存后,你再进行导入试试,就不会存在有读取到空行的现象了,或者就是逻辑过滤,针对为空的数据直接跳过。亲测有效,欢迎采纳!!
四、excel模板附录🔥
如下附上我导入的excel模板样例:
sheet1截图:
sheet2截图:
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导入?这你得会|超级详细,建议收藏
Qt系列文章之二十九(基于QThread的掷骰子线程实例讲解)
Qt系列文章之二十九(基于QThread的掷骰子线程实例讲解)