使用poi-tl向word文档中添加文字、表格

282 阅读1分钟

poi-tl

通常我们开发word文档导出功能时经常会遇到需要向文档中添加文字、图片、表格这类内容。

文字

poi-tl 的 demo 中插入的就是一个纯粹的文字,但是我们开发过程中一般情况下都是一段话然后替换掉其中一部分,就类似于下面这样:

image.png

文档中其实只需要替换掉 年、月、日对应的字符就可以了,我们把模板改成这样:今天是 {{ year }}年{{ month }}月{{ day }}日

image.png

然后我们在代码中分别给 year、month、day 几个参数赋值就能实现通过获取当前的日期导出对应的文档日期了。 具体的代码实现:

XWPFTemplate template = XWPFTemplate.compile("src/test/resources/template/template.docx").render(
        new HashMap<String, Object>(){{
            put("year", year);
            put("month", month);
            put("day", day);
        }});
try {
    template.writeAndClose(new FileOutputStream("/out.docx"));
}catch (Exception e){
    e.printStackTrace();
}

其中 year、month、day 这三个参数是在 java 中已经获取到的数据。

表格

使用表格的方式和 文字 的方式有些许出入,比如需要导出一个这样的文档: image.png 导出某一个月的所有日期,首先我们需要确定使用的是一个数组对象,然后对象中保存着对应的年、月、日的信息,poi-tl 官方给的动态表格的写法是这样的:

image.png

java 中给有一个 list 中对应三个属性对应的值,然后给到 list 中,塞入到 HashMap<String, Object>() 中就可以。
但是需要注意的是要标识一下这个地方是表格使用到的数组,否则的话就会把它当作是一个字符串进行显示,可以按照下面的方式进行处理:

ConfigureBuilder configureBuilder = Configure.builder();
// 拼接 数组对象 否则模板中用不了
if( null != arr ) {
    arr.stream().forEach(str -> {
        configureBuilder.bind(str, policy);
    });
}