携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十二天,点击查看活动详情
由于公司有需求需要生成PDF文件,考虑直接生成PDF文件需要画PDF模板,决定采用先生成Excel或者word,再将生成好的文件转为PDF的方式达到想要的效果。 由于Excel转PDF所采用的包需要收费,于是用poi-tl生成word,再转为PDF。 poi-tl是Word模板引擎,基于Word模板和数据生成新的文档。
- 引入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>
- 新建word模板 模板示例:
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}},在表格中加入字段名
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"));