poi-tl模板生成word文件(一)

761 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十二天,点击查看活动详情

由于公司有需求需要生成PDF文件,考虑直接生成PDF文件需要画PDF模板,决定采用先生成Excel或者word,再将生成好的文件转为PDF的方式达到想要的效果。 由于Excel转PDF所采用的包需要收费,于是用poi-tl生成word,再转为PDF。 poi-tl是Word模板引擎,基于Word模板和数据生成新的文档。

  1. 引入jar包依赖
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.10.0</version>
    <exclusions>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 新建word模板 模板示例:

image.png

poi-tl是一种无逻辑「logic-less」的模板引擎,没有复杂的控制结构和变量赋值,只有标签。标签由前后两个大括号组成,{{title}}是标签,{{?title}}也是标签,title是这个标签的名称,问号标识了标签类型,接下来我们来看看有哪些默认标签类型(用户可以创建新的标签类型,这属于更高级的话题)。

poi-tl中有很多标签,各个标签代表的含义都不一样,在模板中使用标签,代码中按照标签赋值规范赋对应的数据

  • 文本标签 {{title}}

代码赋值示例:

示例一:

Map map = new HashMap();
map.put("title","标题");

示例二: 新建对象,对象中的字段名定为title(后续示例皆可用对象形式赋值)

public class TestModel{
    private String title;
}
  • 图片标签 {{@img}}

代码赋值示例:

示例一:

Map map = new HashMap();
//值可以是地址,也可以是文件流等
map.put("img","http://xx.img");
// 设置图片宽高 
map.put("img", Pictures.ofLocal("logo.png").size(120, 120).create());
  • 表格标签 示例一:

{{#var}}

Map map = new HashMap();
map.put("var", Tables.of(new String[][] {
   new String[] { "00", "01" };
}).border(BorderStyle.DEFAULT).create());

示例二:

在循环行的上一行加入表格对象名称{{list}},在表格中加入字段名

image.png

public class TestModel{
    private String title;
    /**
     * 列表数据
     */
    private List<SubList> list;
}

public class SubList{
    private String serialNum;
    private String c1;
    private String c2;
    ...
}
  • 列表标签 {{*var}}
Map map = new HashMap();
map.put("list", Numberings.create("test1", "test2", "test3"));