Springboot系列(十六):集成easypoi实现word模板多数据页导出(实战篇二)

6,709 阅读6分钟

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

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

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

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

       前几期呢,我们主要是讲了如何集成easypoi实现excel的导入导出功能,对吧。不知道你们掌握的如何,如果还对以下任意一篇有疑问,还请大家多多提问,哈哈哈,虽然不是什么大佬,但是我会尽全力相授,一起学习查缺补漏。

       对于上一期所言,我们是讲了如何实现word模板的导出生成多页数据,比如下边截图:

       对吧,但是除了上边这种多页面导出的情况外,我还接过一种需求就是需要把所有数据在一个模板内全部展示,像这种情况,我们上一期讲解的的就不是那么适用了,所以这一期,我就来讲讲,如何在一个word模板内遍历输出所有的数据,具有很好的学习价值,大家好好听哦。

二、引入pom依赖

       由于EasyPoi可以很方便的通过一个word模板,然后通过填充模板的方式生成我们想要的word文档。所以我们今天依旧是基于easypoi来实现一个word模板内遍历输出所有的数据。

<!--easypoi依赖,excel导入导出-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>

三、实现word导出

1、先来定义一个word模板文件

       我还是以用户类进行导出吧,所以我就在word中创建一个表格, 表格输出所有用户的详细信息。所以我指定的word模板文件如下:

拓展:

       模板里头就包含正常的标签以及fe遍历了,fe遍历了,fe遍历应该是使用最广的遍历,用来解决遍历后下面还有数据的处理方式我们要生成的是这个需要一些list集合和一些单纯的数据。

fe写法:

语法:fe标志 冒号 list数据 单个元素数据(默认t,可以省略不写)  第一个元素

实例演示如下,以作为参考:

{{$fe: userList t t.id }}

        userList对应于你代码中传入exportWord07(String url, Map<String, Object> map)的map中含有list的那个map键。

具体请看如下:

2、Controller添加word导出方法

       我们先来定义一个word文档导出方法,目的是提供一个口子,好方便自己通过浏览器访问进行测试。

/**
 * word文档导出到一个模板中
 */
@GetMapping("export-word-all")
@ApiOperation(value = "word文档导出到一个模板中", notes = "word文档导出到一个模板中")
public void exportUsersToWordAll(HttpServletResponse response) throws Exception {
    userService.exportUsersToWord(response);
}

       不需要任何返回值及参数,你只需要携带你调用接口时的请求HttpServletResponse 即可。

3、定义导入接口

/**
 * word文档导出到一个模板中
 */
void exportUsersToWordAll(HttpServletResponse response) throws Exception;

4、实现导出方法(核心)

       如下这个导出实现类就很关键了,我们还是直接使用easypoi提供的exportWord07()方法,该方法就可以将你的数据进行赋值转化到指定的word模板中,但是涉及到内部遍历问题,还是与word导出的赋值方式不太一样。详细使用请参考我写的:

代码具体设置如下:

/**
 * word文档导出到一个模板中
 */
@Override
public void exportUsersToWord(HttpServletResponse response) throws Exception {

    //准备导出数据
    Map<String, Object> mapList = new HashMap<>();
    List<Map<String, Object>> listUsers = new ArrayList<>();

    //查询所有用户数据
    List<UserEntity> users = this.list();

    //设置一个原子整型。
    AtomicInteger i= new AtomicInteger(1);
    //循环添加到一个集合中。
    users.forEach(user -> {
        Map<String, Object> map = new HashMap<>();
        //生成序号
        map.put("id", i.getAndIncrement());
        map.put("name", user.getName());
        map.put("age", user.getAge());
        map.put("sex", user.getSex());
        map.put("address", user.getAddress());
        map.put("describes", user.getDescribes());

        //添加到集合中,一个map就是一行
        listUsers.add(map);
    });
    //添加到返回集合中
    mapList.put("users", listUsers);
    //设置班级
    mapList.put("class", "六(1)班");
    //设置操作人
    mapList.put("operator","admin");
    //设置当前时间
    mapList.put("createTime","2022/02/17");

    //导出word并指定word导出模板
    XWPFDocument doc = WordExportUtil.exportWord07("./template/用户导出模板_all.docx", mapList);
    //设置编码格式
    response.setCharacterEncoding(StandardCharsets.UTF_8.name());
    //设置内容类型
    response.setContentType("application/octet-stream");

    //设置头及文件命名。
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("学生基本信息表.docx", StandardCharsets.UTF_8.name()));

    //写入
    doc.write(response.getOutputStream());}

       如上代码需要的留意的就是两种赋值,一种是map添加基本数据类型,一种是map添加集合。这也就奠定了在你word模板中数据取值方式啦。

5、浏览器测试接口

       我们打开浏览器,在地址栏,输入我们刚才在Controller暴露出来的接口地址:

比如我的:http://localhost:8080//user/export-word-all 你按你的接口地址进行访问即可。

       输入完直接回车,可以看到有一个文件正在被下载,剩下的就看内容是否被回填了。

       看到上方截图,是不是就觉得比我上一期单模板生成多页的模式好太好了,有木有,然后就是我们设置的单取值与遍历取值,都在word中渲染出来了。

       我们也可以对比一下,上一期生成的单模板多页的word模式,看你的需求想实现那种方式了,就使用那种。

       两种展示方法上,代码写法上都95%都一致,唯独就是在导出word遍历成一个模板方式上调用exportWord07()多加了一个map进行嵌套传入,还有就是模板写法写法!这需要特别注意,写错了模板可是取不到值呢。

       对比一下,就是参数上的改变,从而导致可以进行内部遍历,其实你用单模板也可以跟当前模板写法一致,但是当前模板只适用于字段在每一列上,要是行展示!是不行的,这点大家需要注意。

       如下是exportWord07()方法的重载,适配多种数据类型的入参,从而也奠定了我们可以实现内循环数据的基础。

exportWord07(String url, Map<String, Object> map)

exportWord07(String url, List<Map<String, Object>> list)

       ... ...

       好啦,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

四、往期热门推荐

文末🔥

如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

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

感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!