poi-tl(word模板渲染)
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
推荐使用工厂 Tables
、 Rows
和 Cells
构建表格模型。
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模板渲染)相关推荐
- apache poi使用例_使用java Apache poi 根据word模板生成word报表例子
[实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...
- java word apache poi 操作word模板。
apache poi 操作word模板. 操作方式: 1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换. 2.对于需要增长的表格 ...
- 利用poi读取word模板文件生成新的word文档
利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...
- 使用java Apache poi 根据word模板生成word报表
使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...
- java word模板poi生成文件_利用poi读取word模板文件生成新的word文档
利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...
- org.apache.poi往word模板中填充数据(word2003)
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.通过字面意思,我们大概知道这个API是可以用来做 j ...
- java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片
介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...
- java使用poi替换word模板
poi 操作word文档 0. 参考文档 感谢大萌音音's B站视频的分享, 如有不懂, 可以去看这个视频 1. poi 依赖 <dependency><groupId>org ...
- poi导出word模板
**poi导出word模板段落处理 流程: 1:读取文档:` //获取docx解析对象 XWPFDocument document = new XWPFDocument(POIXMLDocument. ...
最新文章
- 关于Unity中RectTransform和Transform
- 谷歌警告:安卓再现高危漏洞 华为小米等可能被黑客完全控制
- MATLAB应用实战系列(四十五)-matlab任意图形轮廓坐标提取【含源代码】
- 2016年10月起微软更改了更新服务模型
- 时代风口下,东软集团软件业务怎么转型?
- python dict.fromkeys()研究
- 计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看
- php常用编码,简介常见的编码方式
- mysql学习day01
- 开发步骤_社交app开发步骤,送给不懂app开发的你
- 阿迪达斯成立全球首个零售学院,并开设“模拟店铺”
- CVPR2022-HairCLIP:基于文本和参考图像的头发编辑方法论文理解
- 学计算机学体育生闺女,适合女孩学的体育项目
- 好书推荐——从零开始学习 Julia 编程、数学和数据科学。
- Android最火的框架系列(五)GreenDao
- html怎样创建复选框,如何使用可点击标签创建HTML复选框
- Python nbs***bsp; 乱码
- Java 获取本地时间与网络时间
- 2021年P气瓶充装考试题及P气瓶充装最新解析
- Chrome访问https页面 攻击者可能会试图从 XX.XX.XX.XX 窃取您的信息(例如:密码、通讯内容或信用卡信息)直接键盘敲入这11个字符:thisisunsafe
热门文章
- Python - HTTP请求
- 视频编辑软件‘编辑星’推百款圣诞新年素材
- 使用requests和re模块爬取i春秋论坛的精品贴(小爬虫)
- 《憨豆特工2》[BD-R/880M][中英双字][1024分辨率]
- 前向传播和反向传播(举例说明)
- 进制的转换(二进制,十进制,八进制,十六进制)
- element UI 中 el-tree 树形菜单新增、删除操作
- 如果你喜欢上了一个程序员小伙,献给所有的程序员女友
- 完全图解scrollLeft,scrollWidth,clientWidth,offsetWidth
- @descriptor