• 在线问题反馈模块实战(十九):实现数据批量导出到excel文件中功能


    👨‍🎓作者:bug菌

    ✏️博客:CSDN掘金

    💌公众号:猿圈奇妙屋

    🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

    🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

    一、概述🔥

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

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

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

    二、正文🔥

            对于上几期而言,我们后面将近15篇都是干货级教学文章,写的都是对于具体业务场景, 如何通过接口的形式去实现,这也是你们在未来业务中经常需要涉及的东西,既然前后端分离,那肯定都是需要数据就得提供接口,通过请求接口获取数据,页面通过接口返回的数据进行渲染,这就是形成了一个闭环,而这一期呢?我给大家带来点什么呢?你们猜猜。

            本期其实内容也很简单,做的内容是对于上两期excel文件类型业务形成一个闭环,业务支持文件导入,自然就支持文件导出,所以这一期的内容相对而言,还是一起excel文件如何实现导出的功能教程。

            那么,废话不多说,咱们直接整活儿吧!

    三、如何代码实现分页查询功能🔥

    0️⃣ 引入依赖

            对于excel的导入导出功能,我们这里用到的是easypoi的开源组件,也推荐大家使用。使用起来简单且易上手,上一期我们也是通过它提供的导入方法实现excel文件的导入读取,现在要实现excel文件的导出,人家依旧有提供对于的方法。

            so,只需要在你们的pom依赖配置文件中加上如下依赖配置即可,若是已经引入的小伙伴可以直接跳过此步骤。

    1. cn.afterturn
    2. easypoi-spring-boot-starter
    3. 4.3.0

    1️⃣定义Controller请求

            面临第一步,就是确定接口请求格式,如果你对于返回值没有固定概念,你们可以先不确定,最后根据具体方法返回什么再定返回类型即可。我是直接不需要返回值,毕竟导出,成功就是文件直接下载,还需要啥返回值呢,对吧。

    如下是我所定义的接口请求,仅供参考:

    1. /**
    2. * excel批量导出问题反馈
    3. */
    4. @GetMapping("/export")
    5. @ApiOperation(value = "excel批量用户导出", notes = "excel批量用户导出")
    6. public void export(HttpServletResponse response) {
    7. userQuestionsService.exportQuestions(response);
    8. }

    2️⃣定义接口方法exportQuestions()

            既然无返回值,直接void即可。

    1. /**
    2. * excel批量导出问题反馈
    3. */
    4. void exportQuestions(HttpServletResponse response);

    3️⃣重写exportQuestions()方法

            重写exportQuestions()方法,目的就是把核心逻辑写进去。而正确对于excel文件的导入,我分为两步来写,第一步,获取需要导出的数据集,第二步调用导出方法将数据集写入到文件流中。

    具体如何实现?请看我如下代码实现逻辑:

    1. /**
    2. * excel批量导出问题反馈
    3. */
    4. @Override
    5. public void exportQuestions(HttpServletResponse response) {
    6. try {
    7. //从数据库查询所有除删除外的数据
    8. LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    9. wrapper.ne(UserQuestionsEntity::getStatus,2);
    10. wrapper.orderByDesc(UserQuestionsEntity::getCreateTime);
    11. List questions = this.list(wrapper).subList(0,3);//只取3条数据。
    12. //设置信息头,告诉浏览器内容为excel类型
    13. response.setHeader("content-Type", "application/vnd.ms-excel");
    14. //设置下载名称
    15. response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("所有用户问题反馈导出报表.xls", StandardCharsets.UTF_8.name()));
    16. //字节流输出
    17. ServletOutputStream out = response.getOutputStream();
    18. //设置excel参数
    19. ExportParams params = new ExportParams();
    20. //设置sheet名名称
    21. params.setSheetName("问题反馈列表");
    22. //设置标题
    23. params.setTitle("所有用户问题反馈列表");
    24. //转成对应的类型;要不然会报错,虽然也可以导出成功
    25. List exportUsers = this.changeType(questions);
    26. //导入excel
    27. Workbook workbook = ExcelExportUtil.exportExcel(params, ExportQuestions.class, exportUsers);
    28. //写入
    29. workbook.write(out);
    30. } catch (Exception e) {
    31. e.printStackTrace();
    32. }
    33. }

             注意一下:我是由于项目是本公司未开源项目,其中数据都为测试所用,所以至此我是对查询数据集做了一个筛选,按创建时间倒序排列且取了前三条,为什么是前三条,这不就是我们上午刚导入的这三条数据嘛,也正是由于给大家演示的数据,所以不怕涉密,这你们能理解吧。所以对于结果集你们应该是传入你们想导出展示的数据集即可。

            然后就是指定文件名、文件内标题、文件sheet名等自定义好。还有对于changeType()方法,目的是为了做pojo转写,将实体转成对于的导出类pojo,比如我上文所涉及的QuestionsEntity 转成ExportQuestions。

    具体转写如下:

    1. /**
    2. * 转成导出vo
    3. */
    4. private List changeType(List questions) {
    5. List res = new ArrayList<>();
    6. for (UserQuestionsEntity question : questions) {
    7. ExportQuestions exportUser = new ExportQuestions(question);
    8. res.add(exportUser);
    9. }
    10. return res;
    11. }

            至此,导出接口请求就定义好了。我们直接走接口测试,查验下接口是否有报错情况。项目先重启一下。

    4️⃣接口测试

            这里我由于是添加了token拦截认证,所以我还是将该请求接口方法挪到了common模块下。这样我就不需要请求时携带token请求头了,你们具体情况具体看待,因为想用浏览器模拟请求,设置请求的header就没啥办法了。

            输入定义好的请求地址,然后直接在浏览器上,回车,你们可以看到,会弹出一个下载框,那就是浏览器在帮你将执行导出方法所致。

            对于导出的excel文件,我们可以看下,文件名,标题名,sheet名及记录内容,是否都与你查询出的内容一致?你都可以从数据上,代码上一一校验,好吧。

            如上导出,控制台并无报错哦,所以对于需要的小伙伴们,可以放心拿去参考了,你们要改的也就是其导出记录,然后指定的文件名及标题名等自定义内容,其他的都可以照搬照抄,都给大家测试好了,放心吧。

    5️⃣总结

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

     ... ...

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

    四、往期热文推荐🔥

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

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

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

    五、文末🔥

            如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《springboot零基础入门教学》,都是我一手打下的江山,持续更新中,希望能帮助到更多小伙伴们。

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

            最后送大家两句我很喜欢的话,与诸君共勉!


    ☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以开始。

    🍀你能从现在开始改变,也可以一成不变;这件事,没有规矩可言,你可以活出最精彩的自己。


    💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

    💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

    💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;

    💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

    💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。

  • 相关阅读:
    [做初中数学题做到打起来了]跟同事为了他小孩的数学题杠上了
    单片机毕业设计智能家居集成控制器
    node.js--简介、特点、控制台常用指令、http模块、fs模块
    The Grapes NFT 概览与数据分析
    超大规模研究发现,缺乏维生素D,增加早逝风险
    会议邀请 | 思腾合力邀您共赴CNCC 2023中国计算机大会
    卡方检验--离散变量相关性分析--机器学习特征选择
    IO流的学习1
    搭建自己的文件服务器
    MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
  • 原文地址:https://blog.csdn.net/weixin_43970743/article/details/125277793