开头语
要能重新选择,我一定不做马云 ————马云
需求分析
之前一直在做导出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}}
实现的结果
遇到的问题
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}}属性名
结束语
你真正喜欢想要的,没有一样,是可以轻易得到的。这就是努力的理由。