在线问题反馈模块实战(十八):实现excel台账文件记录批量导入功能

举报
bug菌 发表于 2023/06/16 15:22:36 2023/06/16
【摘要】 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN/阿里云/华为云/51CTO 博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号猿圈奇妙屋」,欢迎你的加入!免费领取简历模板/学习资料/大厂面试真题/职业规划等海量资料。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 6 分钟

        嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

        如果小伙伴们在批阅文章的过程中觉得文章对自己有帮助,请别吝啬手中的赞呀,大胆的把文章点亮👍,相信你点赞了好的文章,平台也会经常给你推荐高质量好文,您的点赞三连(收藏+关注+留言)就是对bug菌写文道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

       接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。

环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8

       若小伙伴们在批阅文章的过程中觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️ 

二、正文🔥

        由于上一期我给大家演示了如何从服务器下载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文件") MultipartFile file) {
        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 orderNum 下标,从0开始。
     */
    @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 String inPage;

}

        不会定义的你们跟着我给出的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 questions
     */
    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入库了,证明这个业务功能是ok无误的,你们也可以copy正常拿去用啦。

        最后我们再来看下数据库刚写入的数据,给大家校验一波,是否与excel内容一致?

         写条sql按时间倒序排序查询一下,从库里也准确查出了我们刚导入的那部分数据,这下你们总该可以放心copy了吧。

        说实在的,我对自己要求还是很高的,一般如果是对于有功能问题或逻辑问题的代码,我都不会拿出来演示,以免误人子弟,既然要教学,那就要做到起码代码运行正常,且符合当时业务场景要求,否则就不写不分享。 

5️⃣总结

        对于越简单的逻辑接口而言,我们都要百分百用心写。

 ... ...

        好啦,以上就是这期的所有内容啦,你们学废了么?如果对你有所帮助,还请不要忘记给bug菌[三连支持]哟。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『猿圈奇妙屋』,后台回复关键词领取学习资料、大厂面经、面试模板等海量资源,就等你来拿。

四、往期热文推荐🔥

        对于问题反馈模块实战开发,我完整的梳理了每一期的教学及链接地址,仅供参考:希望能对你们有所帮助。

        如上是整整二十期内容,每一期都是干货,对于一个模块的开发,如何一点一滴打造并测试部署上线,我再说一遍,这不是演习,是实战!是实战!是实战!

        若你们觉得只是需要了解其中某个知识点或者业务的话,也不反对,你就选择其中的几期进行学习就好,反正都已经完结啦;我只希望你们能有所收获,有所成长,也就不枉我苦心每天下班后给大家总结更新。

五、文末🔥

        如果还想要学习更多,小伙伴们直接订阅bug菌专门为大家创建的零基础入门Spring Boot专栏《滚雪球学Spring Boot》,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。