poi-tl(poi-template-language)

序言

方案 移植性 功能性 易用性
Poi-tl Java跨平台 Word模板引擎,基于Apache POI,提供更友好的API 低代码,准备文档模板和数据即可
Apache POI Java跨平台 Apache项目,封装了常见的文档操作,也可以操作底层XML结构 文档不全,这里有一个教程:Apache POI Word快速入门
Freemarker XML跨平台 仅支持文本,很大的局限性 不推荐,XML结构的代码几乎无法维护
OpenOffice 部署OpenOffice,移植性较差 - 需要了解OpenOffice的API
HTML浏览器导出 依赖浏览器的实现,移植性较差 HTML不能很好的兼容Word的格式,样式糟糕 -
Jacob、winlib Windows平台 - 复杂,完全不推荐使用

第一部分 什么是poi-tl

​ FreeMarker或Velocity基于文本模板和数据生成新的html页面或配置文件。poi-tl是一个基于Word模板和数据生成新文档的Word模板引擎。

​ Word模板样式丰富。Poi-tl将在生成的文档中完美地保留模板中的样式。您还可以设置标签的样式。标签的样式将应用于替换的文本,因此您可以专注于模板设计。

​ poi-tl是一个“无逻辑”的模板引擎。没有复杂的控制结构和变量赋值,只有标签,有些标签可以用文字、图片、表格等代替。,一些标签会隐藏某些文档内容,而另一些标签会循环一系列文档内容。

​ poi-tl支持自定义函数(插件),函数可以在Word模板的任何地方执行,在文档的任何地方做任何事情是poi-tl的目标。

特性 描述
Text 将标签呈现为文本
Picture 将标签渲染为图片
Table 将标签呈现为表格
Numbering 将标签呈现为编号
Chart 条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼状图(3D饼状图)等图表渲染
If Condition 根据条件隐藏或显示某些文档内容(包括文本、段落、图片、表格、列表、图表等。)
Foreach Loop 循环浏览某些文档内容(包括文本、段落、图片、表格、列表、图表等。)根据收藏
Loop table row 循环来复制呈现的表格中的一行
Loop table column 循环复制并呈现表中的一列
Loop ordered list 支持有序列表的循环,同时支持多级列表
Highlight code 代码块的单词高亮显示,支持26种语言和数百种颜色样式
Markdown 将Markdown转换为word文档
Word attachment 在Word中插入附件
Word Comments 完成支持评论、创建评论、修改评论等。
Word SDT 完全支持结构化文档标签
Textbox 支持文本框中的标签
Picture replacement 用另一张图片替换原始图片
bookmarks, anchors, hyperlinks 支持在文档中设置书签、锚点和超链接
Expression Language 完全支持SpringEL表达式,并可以扩展更多的表达式:OGNL,MVEL…
Style 模板就是样式,代码也可以设置样式
Template nesting 模板包含子模板,子模板又包含子模板
Merge Word 合并,也可以在指定位置合并
custom functions (plug-ins) 插件设计,在文档的任何地方执行功能

第二部分 Maven

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version>
</dependency>

NOTE: poi-tl 1.12.x 要求 POI 版本在 5.2.2+.

Apache POI已经进入5.0.0+时代,如果你仍希望使用低版本的Apache POI,请查阅历史版本。

  • 当前版本 1.12.0 Documentation,Apache POI5.2.2+,JDK1.8+
  • 1.11.x Documentation,Apache POI5.1.0+,JDK1.8+
  • 1.10.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.10.3 Documentation,Apache POI4.1.2,JDK1.8+
  • 1.9.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.8.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.7.x Documentation,Apache POI4.0.0+,JDK1.8+
  • 1.6.x Documentation,Apache POI4.0.0+,JDK1.8+
  • 1.5.x Documentation,Apache POI3.16+,JDK1.6+

V1.12.0版本作了一个不兼容的改动,升级的时候需要注意:

  • 重构了PictureRenderData,改为抽象类,建议使用Pictures工厂方法来创建图片数据

第三部分 快速开始

简单的使用案例:我们使用poi-tl模板引擎替换word模板中的{{title}}

1、创建一个新的word文档template.docx,里面包含了一个标签{{title}}

2、TDO模式:Template + data-model = output

public static void main(String[] args) throws IOException {XWPFTemplate.compile("D:\\template.docx").render(new HashMap<String, Object>(){{put("title", "poi-tl template engine");}}).writeToFile("D:\\out_template.docx");
}# 网络流输出
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition","attachment;filename=\""+"out_template.docx"+"\"");// HttpServletResponse response
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);

第四部分 Tags

​ 标签由两个花括号组成,{{title}}是标签,{{?title}}也是标签,title是标签的名称,而?标识标签的类型。接下来,我们来认识一下有哪些标签类型。

4.1 文本

文本标签{{var}}

数据模型:

  • String :文本
  • TextRenderData :有样式的文本
  • HyperlinkTextRenderData :超链接和锚点文本
  • Object :调用 toString() 方法转化为文本

4.1.1 代码示例

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

4.1.2 链式代码示例

除了new操作符,还提供了更加优雅的工厂 Texts 和链式调用的方式轻松构建文本模型。

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());

所见即所得,标签的样式会应用到替换后的文本上,也可以通过代码设定文本的样式。

4.1.3 TextRenderData的结构体

{"text": "Sayi","style": {"strike": false, "bold": true, "italic": false, "color": "00FF00", "underLine": false, "fontFamily": "微软雅黑", "fontSize": 12, "highlightColor": "green", "vertAlign": "superscript", "characterSpacing" : 20 }
}

4.2 图片

图片标签以@开始:{{@var}}

数据模型:

  • String :图片url或者本地路径,默认使用图片自身尺寸
  • PictureRenderData
  • ByteArrayPictureRenderData
  • FilePictureRenderData
  • UrlPictureRenderData

推荐使用工厂 Pictures 构建图片模型。

4.2.1 代码示例

// 指定图片路径
put("image", "logo.png");
// svg图片
put("svg", "https://img.shields.io/badge/jdk-1.6%2B-orange.svg");// 设置图片宽高
put("image1", Pictures.ofLocal("logo.png").size(120, 120).create());// 图片流
put("streamImg", Pictures.ofStream(new FileInputStream("logo.jpeg"), PictureType.JPEG).size(100, 120).create());// 网络图片(注意网络耗时对系统可能的性能影响)
put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png").size(100, 100).create());// java图片
put("buffered", Pictures.ofBufferedImage(bufferImage, PictureType.PNG).size(100, 100).create());

图片支持BufferedImage,这意味着我们可以利用Java生成图表插入到word文档中。

4.2.2 FilePictureRenderData的结构体

{"pictureType" : "PNG", "path": "logo.png", "pictureStyle": {"width": 100, "height": 100 },"altMeta": "图片不存在"
}

4.3 表格

表格标签以#开始:{{#var}}

数据模型:

  • TableRenderData

推荐使用工厂 TablesRowsCells 构建表格模型。

4.3.1 Example 1. 基础表格示例

// 一个2行2列的表格
put("table0", Tables.of(new String[][] {new String[] { "00", "01" },new String[] { "10", "11" }}).border(BorderStyle.DEFAULT).create());
00 01
10 11

4.3.2 Example 2. 表格样式示例

// 第0行居中且背景为蓝色的表格
RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF").bgColor("4472C4").center().create();
RowRenderData row1 = Rows.create("李四", "博士");
put("table1", Tables.create(row0, row1));
姓名 学历
李四 博士

4.3.3 Example 3. 表格合并示例

// 合并第1行所有单元格的表格
RowRenderData row0 = Rows.of("列0", "列1", "列2").center().bgColor("4472C4").create();
RowRenderData row1 = Rows.create("没有数据", null, null);
MergeCellRule rule = MergeCellRule.builder().map(Grid.of(1, 0), Grid.of(1, 2)).build();
put("table3", Tables.of(row0, row1).mergeRule(rule).create());
列0 列1 列2
没有数据

TableRenderData表格模型在单元格内可以展示文本和图片,同时也可以指定表格样式、行样式和单元格样式,而且在N行N列渲染完成后可以应用单元格合并规则 MergeCellRule ,从而实现更复杂的表格。

4.3.4 TableRenderData的结构体

{"rows": [ {"cells": [ {"paragraphs": [ {"contents": [{[TextRenderData] },{[PictureRenderData] }],"paragraphStyle": null }],"cellStyle": { "backgroundColor": "00000","vertAlign": "CENTER"}}],"rowStyle": { "height": 2.0f}}],"tableStyle": { "width": 14.63f, "colWidths": null},"mergeRule": { "mapping": {"0-0": "1-2"}}
}

4.4 列表

列表标签以*开始:{{*var}}

数据模型:

  • List<String>
  • NumberingRenderData

推荐使用工厂 Numberings 构建列表模型。

4.4.1 代码示例

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

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

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

4.5 区块对

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

区块对开始和结束标签中间可以包含多个图片、表格、段落、列表、图表等,开始和结束标签可以跨多个段落,也可以在同一个段落,但是如果在表格中使用区块对,开始和结束标签必须在同一个单元格内,因为跨多个单元格的渲染行为是未知的。

区块对在处理一系列文档元素的时候非常有用,位于区块对中的文档元素可以被渲染零次,一次或N次,这取决于区块对的取值。

  • False或空集合

    隐藏区块中的所有文档元素

  • 非False且不是集合

    显示区块中的文档元素,渲染一次

  • 非空集合

    根据集合的大小,循环渲染区块中的文档元素

4.5.1 False或空集合

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

4.5.1.1 数据模型
{"announce": false
}
4.5.1.2 模板
template.docx
Made it,Ma!{{?announce}}Top of the world!{{/announce}}Made it,Ma!{{?announce}}Top of the world!												

poi-tl(word模板渲染)相关推荐

  1. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

  2. java word apache poi 操作word模板。

    apache poi 操作word模板. 操作方式: 1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换. 2.对于需要增长的表格 ...

  3. 利用poi读取word模板文件生成新的word文档

    利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...

  4. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  5. java word模板poi生成文件_利用poi读取word模板文件生成新的word文档

    利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...

  6. org.apache.poi往word模板中填充数据(word2003)

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.通过字面意思,我们大概知道这个API是可以用来做 j ...

  7. java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片

    介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...

  8. java使用poi替换word模板

    poi 操作word文档 0. 参考文档 感谢大萌音音's B站视频的分享, 如有不懂, 可以去看这个视频 1. poi 依赖 <dependency><groupId>org ...

  9. poi导出word模板

    **poi导出word模板段落处理 流程: 1:读取文档:` //获取docx解析对象 XWPFDocument document = new XWPFDocument(POIXMLDocument. ...

最新文章

  1. 关于Unity中RectTransform和Transform
  2. 谷歌警告:安卓再现高危漏洞 华为小米等可能被黑客完全控制
  3. MATLAB应用实战系列(四十五)-matlab任意图形轮廓坐标提取【含源代码】
  4. 2016年10月起微软更改了更新服务模型
  5. 时代风口下,东软集团软件业务怎么转型?
  6. python dict.fromkeys()研究
  7. 计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看
  8. php常用编码,简介常见的编码方式
  9. mysql学习day01
  10. 开发步骤_社交app开发步骤,送给不懂app开发的你
  11. 阿迪达斯成立全球首个零售学院,并开设“模拟店铺”
  12. CVPR2022-HairCLIP:基于文本和参考图像的头发编辑方法论文理解
  13. 学计算机学体育生闺女,适合女孩学的体育项目
  14. 好书推荐——从零开始学习 Julia 编程、数学和数据科学。
  15. Android最火的框架系列(五)GreenDao
  16. html怎样创建复选框,如何使用可点击标签创建HTML复选框
  17. Python nbs***bsp; 乱码
  18. Java 获取本地时间与网络时间
  19. 2021年P气瓶充装考试题及P气瓶充装最新解析
  20. Chrome访问https页面 攻击者可能会试图从 XX.XX.XX.XX 窃取您的信息(例如:密码、通讯内容或信用卡信息)直接键盘敲入这11个字符:thisisunsafe

热门文章

  1. Python - HTTP请求
  2. 视频编辑软件‘编辑星’推百款圣诞新年素材
  3. 使用requests和re模块爬取i春秋论坛的精品贴(小爬虫)
  4. 《憨豆特工2》[BD-R/880M][中英双字][1024分辨率]
  5. 前向传播和反向传播(举例说明)
  6. 进制的转换(二进制,十进制,八进制,十六进制)
  7. element UI 中 el-tree 树形菜单新增、删除操作
  8. 如果你喜欢上了一个程序员小伙,献给所有的程序员女友
  9. 完全图解scrollLeft,scrollWidth,clientWidth,offsetWidth
  10. @descriptor