poi-tl二次开发

poi-tl是一款非常好用的word模板生成库,更新响应快、文档demo齐全。堪称word模板界的小军刀!

写在前面

如果你对word模板技术有了解、或者有兴趣,更甚者工作中接触过,那么接下来的内容应该会让你有所收获。

介绍poi-tl

功能如下:

  • 文本 {{var}}
  • 表格 {{#var}}
  • 图片 {{@var}}
  • 列表 {{*var}}
  • 嵌套 {{+var}}

更多文档参考如下:poi-tl

这里不再更多的赘述poi-tl的功能了,非常优秀的一个word模板库。

二次开发

如果你还没使用过poi-tl,那么接下来的内容,你应该不太会感同身受。

poi-tl使用一段时间后会发现仍存在一些问题,比如行列表格需要自己写代码指定样式、图片需要写代码指定高度宽度、列表也写代码指定样式。

为最大化利用word的样式,减少代码量,这里在v1.6.0之上进行源码扩展。

加入模板语法:name|attr:var

  • name 为功能名称
  • attr 为属性
  • var 为数据变量名称

fork地址:github

表格

语法:{{table|limit:var}}

  • table 说明是表格
  • limit 为数据填充的行数,数据不足补空
  • var 为填充数据(JSON)的 key,可以是一个对象或者对象数组。

模板:

其中:

  • 姓名的前面出现的{{table|5:[users]}},代表了这是一个表格模板(可以出现在表格的任意位置,建议在表头),users则说明数据中存在一个 users 的 key 。
  • 表格的第二行变量会根据传递的值动态替换,{name}、{age} 等模板,则说明 users 这个 key 中的对象或对象数组存在 name、age 这两个key。
  • 由于数据只有2条,限制5条,因此补空行3条

测试代码:

@Test
public void run() {
Path path = Paths.get("src/test/resources", "table_pattern.docx");
XWPFTemplate template = XWPFTemplate.compile(path.toFile())
// 数据
.render(new HashMap<String, Object>() {{
put("users", Arrays.asList(new User("张三", 1), new User("李四", 2)));
}});
// 输出
Path outPath = Paths.get("src/test/resources", "table_pattern_out.docx");
try (OutputStream os = new BufferedOutputStream(new FileOutputStream(outPath.toFile()))) {
template.write(os);
} catch (IOException e) {
LOG.error("render tpl error", e);
} finally {
try {
template.close();
} catch (IOException e) {
LOG.error("close template error", e);
}
}
}

可以看到这里的 map 中存在 users 这个 key,且存在 2 条数据。User 这个对象有两个属性 name、age ,模板在解析时,会自动取值。

输出:

总结:表格正常渲染,而且样式也正常保留,原来的数据也会保留下来,数据不足补空行。

图片

语法:{{image|height*width:var}}

  • image 说明是图片
  • height*width 代表图片的高度和宽度,单位为厘米
  • var 为填充数据的 key,是一个图片字节通过base64加密的字符串

模板:

测试代码:

@Test
public void run() throws IOException {
Path logoPath = Paths.get("src/test/resources", "logo.png");
byte[] bytes = Files.readAllBytes(logoPath);
byte[] encode = Base64.getEncoder().encode(bytes); Path path = Paths.get("src/test/resources", "image_pattern.docx");
XWPFTemplate template = XWPFTemplate.compile(path.toFile())
// 数据
.render(new HashMap<String, Object>() {{
put("logo", new String(encode));
}});
// 输出
Path outPath = Paths.get("src/test/resources", "image_pattern_out.docx");
try (OutputStream os = new BufferedOutputStream(new FileOutputStream(outPath.toFile()))) {
template.write(os);
} catch (IOException e) {
LOG.error("render tpl error", e);
} finally {
try {
template.close();
} catch (IOException e) {
LOG.error("close template error", e);
}
}
}

输出:

总结:图片能正常根据高度宽度渲染出来

列表

语法:list|limit:var

  • list 说明是列表
  • limit 为数据填充的行数,数据不足补空
  • var 为填充数据的 key,值可以是一个字符串或者一个字符串数组。

模板:

测试代码:

@Test
public void run() {
Path inPath = Paths.get("src/test/resources", "list_pattern.docx");
Path outPath = Paths.get("src/test/resources", "list_pattern_out.docx");
Map<String, Object> model = new HashMap<String, Object>() {{
put("items", Arrays.asList("张三", "李四", "王五"));
}};
try (InputStream is = Files.newInputStream(inPath); OutputStream os = Files.newOutputStream(outPath)) {
Tpl.render(is, model).out(os);
} catch (IOException e) {
LOG.info("render tpl failed", e);
}
}

输出:

总结:列表也能正常渲染,保证原有的格式。

tips

看示例,你也许会觉得很奇怪,为什么语法明明写的var,但是截图中有的写的是[var]、有的却写的var

这是因为变量取值采用的 spring expression 语法:如果代码中是一个对象,就可以直接写var,是一个map,就写[var],数组则是var[下标]

写在最后

如果觉得有用,快快使用起来吧!

poi-tl二次开发的更多相关文章

  1. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  2. 深入理解基于selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是为了易于维护,很多人可能不懂得维护的价值是什么,和到底要 ...

  3. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  4. [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

    目       录 第十二章     二次开发及应用... 2 12.1        项目配制... 3 12.2        引用相关组件... 4 12.3        构建主程序... 5 ...

  5. OBS-Studio二次开发记录

    OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...

  6. 小猪cms微信二次开发之怎样分页

    $db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...

  7. 承接 AutoCAD 二次开发 项目

    本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的 ...

  8. 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...

  9. 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程

    1.1    二次开发流程图 1.2    引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3    开发设备驱动模块 1.3.1    开发发送协议驱动 继承SuperIO.Devi ...

  10. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

随机推荐

  1. P3084 [USACO13OPEN]照片(差分约束)

    (已经有了简化版题面) 又秒了一次dp233 本来按照感觉瞎写了一发... 但还是老老实实列式子吧.... 对差分约束有了更深的理解 #include<cstdio> #include&l ...

  2. 卖饲料——单调队列优化dp

    题目描述 约翰开车来到镇上,他要带K吨饲料回家.运送饲料是需要花钱的,如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元.约翰可以从N家商店购买饲料,所有商店都在一个坐标轴 ...

  3. maven的项目结构

    1.标准目录结构: src -main       –bin 脚本库       –java java源代码文件       –resources 资源库,会自动复制到classes目录里       ...

  4. mysql-大量数据的sql查询优化

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  5. ios input输入不了

    在项目中遇到了一个问题就是input输入框在安卓可以输入,而在ios输入不了 经过百度,调试发现,在ios中input默认是有user-select: none;属性把input输入框禁用了,将其删除 ...

  6. C++中对C的扩展学习新增语法——强制类型转换

    类型转换:主要进行指针类型转换,因为在C++中,不同类型指针不允许隐式转换,任何一个程序中如果出现了大量的类型转换,说明该程序不是太好的程序. 注意事项: 不同类型指针不允许隐式转换: void* 类 ...

  7. JDBC事务的简单使用

    在实际功能当中,经常会碰到同时对一组数据进行增加和减少,最常见的就是交易功能. 事务内执行的语句,要么都成功,要么都失败,如果有一句没执行成功,整个事务都不会提交的. import java.sql. ...

  8. 小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 Linux 基础 CentOS 官网: https: ...

  9. 区块链共识机制之工作量证明(POW)

    像比特币.以太坊.NXT.Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化.无管辖的,由密码学.经济学和社会共识来共同维护.这些加密网络因各种原因有着多 ...

  10. ubuntu 16.04上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/977f5125/,欢迎阅读! compile glog and glags on ubuntu 16.04 Series comp ...