Word-1:使用poi-tl引擎导出word文档

开头语

要能重新选择,我一定不做马云  ————马云

需求分析

之前一直在做导出excel表的功能,导出word也实现过但是并没有什么亮点,最近接触到了poi-tl。

来看下官网的介绍:

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。
在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。

瞅瞅这话说的,忍不住体验一下

主要技术栈:poi-tl官网路径

本文的示例代码按照官方提供的api,结合自己的需求,完成开发工作。

资源下载:完整项目资源下载

所用jar包

我个人是很喜欢先从jar包开始说起,因为我觉得先搭建好一个环境再进行开发工作是很有效率的一件事,
所以这里先上jar包,方便阅读。
官网提供了很多个版本,pot-tl的版本是要配合apache.poi的版本去使用的,我这里使用的版本是
poi-tl  	1.10.0
apache.poi  4.1.2
原因有两个:1、1.10版支持el表达式,能够使用三目运算符等 2、我的apache.poi版本本身就高
	<!--apachepoi 4.1.2 start-->
	<dependency>
	     <groupId>org.apache.poi</groupId>
	     <artifactId>poi</artifactId>
	     <version>${apachepoi.version}</version>
	 </dependency>
	 <dependency>
	     <groupId>org.apache.poi</groupId>
	     <artifactId>poi-ooxml</artifactId>
	     <version>${apachepoi.version}</version>
	 </dependency>
	 <dependency>
	     <groupId>org.apache.poi</groupId>
	     <artifactId>poi-ooxml-schemas</artifactId>
	     <version>${apachepoi.version}</version>
	 </dependency>
	 <!--apachepoi 4.1.2 end-->
	 <!--poi-tl 模板引擎 start-->
	 <dependency>
	     <groupId>com.deepoove</groupId>
	     <artifactId>poi-tl</artifactId>
	     <version>1.10.0</version>
	 </dependency>
	 <dependency>
	     <groupId>org.springframework</groupId>
	     <artifactId>spring-expression</artifactId>
	     <version>4.3.6.RELEASE</version>
	 </dependency>
	 <!--poi-tl 模板引擎 end-->

{apachepoi.version}=4.1.2

项目代码

主方法 :WordController

package com.langlang.wps.controller;

import com.langlang.wps.utils.WpsUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author :Jim
 * @date :Created in 2021/8/10 17:29
 * @description:导出word控制类
 * @modified By:
 * @version: 1.0.0$
 */
@Slf4j
public class WordController {
    
    /**
     * @author Jim
     * @description:生成word文档
     * @date 2021/8/12 10:48
     * @param [args]
     * @return void
     */
    public static void main(String[] args) {
        //模拟数据
        Map<String, Object> map = new HashMap<>();
        map.put("startTime","2014年");
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>() {
            {
                add(new HashMap<String, Object>() {{this.put("value","是我人生中最美的点缀,因你的陪伴,我不再孤单,愿与你漫观云卷云舒,静看花开花落");}});
                add(new HashMap<String, Object>() {{this.put("value","是我生命中最美的际遇,因你的爱,我不再忧伤,愿与你共赴天涯,缠绵缱绻");}});
                add(new HashMap<String, Object>() {{this.put("value","愿我年华里最美的眷恋,因你的关切,我不再彷徨,愿与你琴瑟和鸣,共谱一曲爱的梵音");}});
            }
        };
        map.put("list", list);
        WpsUtil.exportWord(map);
    }

}

工具类 :WpsUtil

package com.langlang.wps.utils;

import cn.hutool.core.io.resource.ResourceUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;

/**
 * word工具类
 */
@Slf4j
public class WpsUtil{

    /**
     * @author Jim
     * @description:导出word
     * @date 2021/8/12 15:09
     * @param [data]
     * @return void
     */
    public static void exportWord(Map<String,Object> data) {
        //文件路径
        String filePath = "";
        try {
            //设置导出路径  创建一个word目录
            String path = "D:/word/";
            File file = new File(path);
            //如果不存在则创建
            if (!file.exists()) {
                file.mkdirs();
            }
            //获取文件名称
            String name = getFilename();
            //获取模板
            XWPFTemplate template = getWordTemplate(data);
            //输出到指定目录下
            filePath = path+name;
            FileOutputStream ostream = new FileOutputStream(filePath);
            template.write(ostream);
            //关闭输出流
            ostream.flush();
            ostream.close();
            template.close();
        }catch(IOException e){
            //异常处理
            log.error("文件导出错误", e);
        }
    }

    /**
     * @author Jim
     * @description:获取导出word的文件名称
     * @date 2021/8/12 15:09
     * @param []
     * @return java.lang.String
     */
    private static String getFilename() {
        //获取100以内的随机数
        double random = Math.random();
        return "与你相遇"+random*100+".docx";
    }

    /**
     * @author Jim
     * @description:获取word模板添加数据后的word文档
     * @date 2021/8/12 15:10
     * @param [data]
     * @return com.deepoove.poi.XWPFTemplate
     */
    private static XWPFTemplate getWordTemplate (Map<String,Object> data) {
        //获取模板的输入流
        InputStream stream = ResourceUtil.getStream("classpath:templates/exportWord.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL();
        XWPFTemplate template = XWPFTemplate.compile(stream,builder.build()).render(data);
        return template;
    }
}

对应的模板

							与你相遇
{{startTime}}我与你相遇,如果命运可以让我再选择一次,我依然无怨无悔与你相遇。
{{?list}}遇见你,{{value}}{{_is_last ? '。' : ';'}}{{/list}}

word模板文档

实现的结果

文档路径
生成结果

遇到的问题

1、poi-tl版本的选择

2、如何遍历list和三目运算符使用

解决的方法

1、因为我apache.poi的版本是4.1.0 ,我不可能为了这个功能去降低我的版本,所以只能去找和它配套的
poi-tl版本,另外,按照poi-tl官网api所说,在遍历list时_is_last 这种判断是否是最后一个元素的属性
只有在1.10.0版本才有,正好它对应的apache.poi版本是4.1.2,升级一个小版本还是没什么问题的

2、遍历list以{{?list}}开头{{/ist}}结尾 中间直接写{{value}}属性名 

结束语

你真正喜欢想要的,没有一样,是可以轻易得到的。这就是努力的理由。
向往美好生活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值