👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
一、概述🔥
时间犹如白驹过隙,一转眼已是六月中旬,高考也告一段落,曾忆起自己当年这个时候已是放飞自我,整天到处约同学戏耍,然而,时过境迁,我以一名社会人的身份坐在办公室,怀揣着当时的心情一起为你们祈祷,能在这场无硝烟的战场上一举成名,金榜题名,寒窗苦读十二载,不就为了这一次,希望高考结果如你所愿,而我却只能站在你们的前面,以回忆做酒,来祭奠我那逝去的青春。作罢作罢!咱们说正事儿。
接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.
二、正文🔥
由于上一期我给大家演示了如何从服务器下载excel模板文件,你们就可能猜到了,会有此期业务场景的诞生,由于考虑前期问题及需求迭代比较多,借此就提出了需要满足用户能够通过excel文件导入问题数据,那么,既然要满足该需求,第一点就是需要按我们所给的台账模块来填写,唯有这样,我们才能通过代码方式来读取excel文件数据,从而将记录保存入库即可。
该场景在现实中也是很常见的一种,所以对于大家而言,也是司空见惯,借此,这期就跟大家一起聊聊如何实现的事儿吧。
三、如何代码实现excel导入功能🔥
0️⃣依赖引入
对于excel的导入导出功能,我们这里用到的是easypoi的开源组件,也推荐大家使用。简单介绍一下,easyPoi是一种专门用于做poi的工具集,使用起来简单且易上手,而且它提供了很多简单的注解和模板语言(熟悉的表达式语法)来完成以前poi复杂的写法。
so,只需要在你们的pom依赖配置文件中加上如下依赖配置,你们就能使用它啦。
<!--easypoi依赖,excel导入导出-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
1️⃣定义Controller请求
由于excel文件导入,即我们只需要开个口子将用户上传的excel接收即可。所以我们对于文件类的处理统一都是用MultipartFile类来接收即可。
/**
* excel批量导入问题反馈
*/
@GetMapping("/import")
@ApiOperation(value = "excel批量导入问题反馈", notes = "excel批量导入问题反馈")
public ResultResponse<Boolean> importUsers(@ApiParam("excel文件") {
return new ResultResponse<>(userQuestionsService.importQuestions(file));
}
2️⃣定义接口方法importQuestions()
对于该接口,我们也是只需要返回一个boolean值即可。因为最后执行结果就是记录的批量写入,返回结果就是一个布尔值。
/**
* excel批量导入问题反馈
*/
Boolean importQuestions(MultipartFile file);
3️⃣实现方法importQuestions()
想要实现该方法,我们还要定义一个导入pojo,它是对应于你excel文件中的列名,底层如何实现的你们可以去看看,一一对应是有先后顺序的,这里我给大家做个示例,具体如何定义请看如下样例,这也是我整期内容所用到的导入类。
ImportQuestions.java
@Data
public class ImportQuestions implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @Excel 作用在一个filed上面,对列的描述
* @param name 列名
* @param
@Excel(name = "姓名", orderNum = "0",width = 10.0)
private String creatorName;
@Excel(name = "域账号", orderNum = "1",width = 10.0)
private String creatorAccountId;
@Excel(name = "部门名称", orderNum = "2",width = 5.0)
private String creatorDeptName;
@Excel(name = "反馈问题类型", orderNum = "3",width = 30.0)
private String questionType;
@Excel(name = "反馈问题详情", orderNum = "4",width = 20.0)
private String questionContent;
@Excel(name = "问题所在页面", orderNum = "4",width = 20.0)
private
不会定义的你们跟着我给出的excel模板文件来写,就能知道它是如何进行确定字段类型,及@Excel注解中的属性了。
定义好了导入pojo,接下来就是要实现如何从excel文件中读取数据且insert入库了。这里分为两步,第一步获取excel文件数据,第二步就是将获取到的数据进行保存入库。
接下来我先给大家演示第一步的实现代码。
/**
* excel批量导入问题反馈
*/
@Override
public Boolean importQuestions(MultipartFile file) {
ImportParams importParams = new ImportParams();
//标题行设置为1行,默认是0,可以不设置;依实际情况设置。
importParams.setTitleRows(1);
// 表头设置为1行
importParams.setHeadRows(1);
// 第几个sheet页
importParams.setStartSheetIndex(0);
try {
List<ImportQuestions> questions = ExcelImportUtil.importExcel(file.getInputStream(), ImportQuestions.class, importParams);
//批量插入
boolean isSuccess = this.saveQuestions(questions);
return isSuccess;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
如上写法,你们就按照我写的逻辑直接用就可以了。对于其中的savaQuestions()方法,也就是我所提到的第二步,实现逻辑有二,第一将pojo导入类转成Entity实体,第二将执行saveBatch()批量插入方法,最终目的是将excel中的所有记录成功保存入库。
/**
* 批量保存问题反馈记录
*
* @param
boolean saveQuestions(List<ImportQuestions> questions) {
//存放UserQuestionsEntity
List<UserQuestionsEntity> questionsEntityList = new ArrayList<>();
//转成UserQuestionsEntity实体
for (ImportQuestions question : questions) {
//验空
if (question != null) {
UserQuestionsEntity questionsEntity = new UserQuestionsEntity(question);
questionsEntityList.add(questionsEntity);
}
}
//批量插入
return this.saveBatch(questionsEntityList);
}
如上代码就已经实现了从上传excel到读取excel记录再到批量插入记录入库几步,接下来就是要测试这个接口是否能完美运行通过了。
4️⃣接口测试
我们先来通过下载好的台账模板,给随便造点数据进去,接着我们就来测试我们上面写好的excel导入接口,看看是否满足业务要求?
如上我是造了三条数据,我们还是通过postman来进行接口测试,将刚创建好数据的excel文件进行添加,然后点击【send】模拟接口请求。
具体传参及步骤演示如下:
我们可以看到请求成功了,返回了code200.而且打开控制台也可以查看控制台实际SQL执行语句,具体如下:
最后我们再来看下数据库刚写入的数据,给大家校验一波,是否与excel内容一致?
写条sql按时间倒序排序查询一下,从库里也准确查出了我们刚导入的那部分数据,这下你们总该可以放心copy了吧。
说实在的,我对自己要求还是很高的,一般如果是对于有功能问题或逻辑问题的代码,我都不会拿出来演示,以免误人子弟,既然要教学,那就要做到起码代码运行正常,且符合当时业务场景要求,否则就不写不分享。
5️⃣总结
对于越简单的逻辑接口而言,我们都要百分百用心写。