在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海.
我们经常会遇到需要定时生成, 发送一些文档的需求, 比如: 简历在线生成, 重要天气预报报告等. 但是手动撰写, 手动发送又特别麻烦, 如果能够自动化生成目标文档, 再自动发送, 那将会给业务人员带来极大的便利. 而 Poi-tl 就是为此而生.
1. poi-tl 简介
poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档.
poi-tl 的工作模式为: Template + data-model = output
1.1 为什么选用 poi-tl
poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性。
这是官方给出的几种解决方案的对比
1.2 特性
目前, poi-tl 已经支持了以下特性:
2. Hello Word - YYDS
2.1 引入依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.11.1</version>
</dependency>
2.2 创建模板
新建一个 word 模板文档
textTemplate.docx
(Office, WPS均可), 如下:
2.3 渲染模板
@Test
void textRender() throws Exception {
// 模板文件
final ClassPathResource templateResource
= new ClassPathResource("textTemplate.docx");
XWPFTemplate template = XWPFTemplate
// 编译模板
.compile(templateResource.getInputStream())
// 渲染模板
.render(
// 渲染模板可以通过 Map 或者 POJO, 数据可以是树结构,每级之间用点来分隔开,比如{{author.name}}标签对应的数据是author对象的name属性值。
new HashMap<String, Object>() {
{
put("text", "Hello, 我是 poi-tl Word 文本模板");
}
}
);
// 输出文件
final File outputFile = new File("/Users/dreamli/Workspace/MyRepository/javafamily/office-product/target/output.docx");
if(!outputFile.exists()) {
if(!outputFile.createNewFile()) {
throw new RuntimeException("创建文件失败!");
}
else {
log.info("在 {} 创建了新的文件.", outputFile.getAbsolutePath());
}
}
// 写出渲染后的文件到指定文件
template.writeAndClose(new FileOutputStream(outputFile));
}
2.4 查看
查看渲染后的文档如下:
3. 标签-Text 文本标签
poi-tl是一种无逻辑「logic-less」的模板引擎,没有复杂的控制结构和变量赋值,只有标签。标签由前后两个大括号组成,{{title}}是标签,{{?title}}也是标签,title是这个标签的名称,问号标识了标签类型.
poi-tl 支持多种标签, 限于篇幅, 本文先讲解 Text 文本标签, 后续持续更新其他标签.
3.1 文本标签模板
模板为:
{{text}}
3.2 数据模型
- String :文本
- TextRenderData :有样式的文本
- HyperlinkTextRenderData :超链接和锚点文本
- Object :调用 toString() 方法转化为文本
3.3 代码示例
put("text", "Hello, 我是 poi-tl Word 文本模板");
put("textRender", new TextRenderData("ff0000", "Render 文本"));
put("link", new HyperlinkTextRenderData("JavaFamily", "http://javafamily.club/"));
put("anchor", new HyperlinkTextRenderData("JavaFamilyAnchorText", "anchor:appendix1"));
除了new操作符,还提供了更加优雅的工厂 Texts 和链式调用的方式轻松构建文本模型。
put("text", "Hello, 我是 poi-tl Word 文本模板");
put("textRender", Texts.of("Render 文本").color("ff0000").create());
put("link", Texts.of("JavaFamily").link("http://javafamily.club/").create());
put("anchor", Texts.of("JavaFamilyAnchorText").anchor("anchor:appendix1").create());
3.4 TextRenderData的结构体
{
"text":"Hello, 我是 poi-tl Word 文本模板",
"style":{
"strike":false, // 删除线
"bold":false, // 加粗
"italic":false, // 斜体
"color":"FF0000", // 颜色
"underLine":false, // 下划线
"fontFamily":"微软雅黑", // 字体
"fontSize":12, // 字号
"highlightColor":"green", // 背景高亮色
"vertAlign":"superscript", // 上标或下标
"characterSpacing":20 // 间距
}
}
文本换行使用
\n
字符。
3.5 创建模板
3.6 渲染结果
4. 下期继续
下期继续其他标签的渲染: 图片, 表格, 列表, 图等…敬请期待…哈哈哈…