Java Word模板引擎-Poi-tl


本文内容从Poi-tl官方文档摘录,poi-tl是一个基于Java POI的Word模板引擎,有着非常强大的功能

此处只摘录了一些我现在需要用到的功能



文章目录





一、简单示例

1.准备一个模板文档 template.docx

在文档中写上{{title}}

2.写一个测试方法

public class PoiTlTest01 {
    @Test
    public void testStart() throws IOException {
        XWPFTemplate template = XWPFTemplate.compile("template.docx").render(new HashMap<String,Object>(){{
            put("title","Hi,poi-tl Word模板引擎");
        }});

        template.writeAndClose(new FileOutputStream("output.docx"));
    }
}


二、标签

1.文本

{{var}}

数据模型:

String 文本
TextRenderData 有样式的文本
HyperlinkTextRenderData 超连接文本
Object 调用toString()方法转换为文本

代码示例:

put("name", "Sayi");
put("author", new TextRenderData("000000", "Sayi"));
put("link", new HyperlinkTextRenderData("website", "http://deepoove.com"));
put("anchor", new HyperlinkTextRenderData("anchortxt", "anchor:appendix1"));

除了使用上面这这种new方法,还可以使用链式调用,使用更优雅的Text来构建文本模型

put("name", "Sayi");
put("author", Texts.of("Sayi").color("000000").create());
put("link", Texts.of("website").link("http://deepoove.com").create());
put("anchor", Texts.of("anchortxt").anchor("appendix1").create());

TextRenderData的结构体
{
  "text": "Sayi",
  "style": {
    "strike": false,  // 删除线
    "bold": true,  // 粗体
    "italic": false,  // 斜体
    "color": "00FF00",  // 颜色
    "underLine": false,  // 下划线
    "fontFamily": "微软雅黑",  // 字体样式
    "fontSize": 12,  // 字体大小
    "highlightColor": "green",  // 背景高亮色
    "vertAlign": "superscript",  // 上标或者下标
    "characterSpacing" : 20  // 间距
  }
}

文本之间换行使用\n


2.列表

列表标签以*开始:{{*var}}
数据模型:

  • NumberingReanderData
    推荐使用工厂Numberings构建编号模型

示例代码:

put("list", Numberings.create("Plug-in grammar",
                    "Supports word text, pictures, table...",
                    "Not just templates"));

编号样式支持罗马字符、有序无序等,可以通过Numberings.os(NumberingFormat)来指定

DECIMAL //1. 2. 3.
DECIMAL_PARENTHESES //1) 2) 3)
BULLET //● ● ●
LOWER_LETTER //a. b. c.
LOWER_ROMAN //i ⅱ ⅲ
UPPER_LETTER //A. B. C.

3.区块对

区块对由前后两个标签组成,开始标签以?标识,结束标签以/标识,如:

{{?sections}}{{/sections}} 

区块对应用范围

区块对开始和结束标签中间可以包含以下内容:

  • 多个图片
  • 表格
  • 段落
  • 列表
  • 图表
  • 等…

其中开始和结束标签可以跨多个段落,也可以在同一个段落,但是如果在表格中使用区块对,开始和结束标签必须在同一个单元格内,因为跨多个单元格的渲染行为是未知的
区块对在处理一些列文档元素的时候非常有用,位于区块对中的文档元素可以被渲染零次,一次或N次,这取决于区块对的取值。

False或空集合

隐藏区块中的所有文档元素
如果区块对的值是null、false或者空的集合,位于区块中的所有文档元素将不会显示,等同于if语句的条件为false
如下:


data-model

{
  "announce": false
}

------

template.docx

Made it,Ma!{{?announce}}Top of the world!{{/announce}}

Made it,Ma!

{{?announce}}

Top of the world!
上一篇:别再问我Python怎么操作Word了!


下一篇:别再问我Python怎么操作Word了!