在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海.

上一节我们对 Poi-tl 进行了简单的介绍以及实现了我们永恒的 HelloWorld, 同时对 poi-tl 的 Text 标签进行了讲解, 本文就继续对 poi-tl 的标签进行介绍.

一、标签-图片

1. 图片标签

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

2. 图片支持

  • 本地图片
  • 网络图片
  • 图片流
  • SVG
  • Java BufferedImage — 意味着我们可以利用Java生成图表插入到word文档中

3. 数据模型

  • String: 图片url或者本地路径,默认使用图片自身尺寸
  • PictureRenderData
{"pictureType" : "PNG",  // 图片类型"pictureSupplier": () -> byte[], // 运行时获取图片byte[]字节数组的函数"pictureStyle": {"width": 100,  // 宽度,单位是像素"height": 100 // 高度,单位是像素},"altMeta": "图片不存在"  // 当无法获取图片时展示的文字
}

4. 示例

4.1 创建模板

4.2 渲染模板

// 模板文件
final ClassPathResource templateResource= new ClassPathResource("2imgTemplate.docx");XWPFTemplate template = XWPFTemplate// 编译模板.compile(templateResource.getInputStream())// 渲染模板.render(// 渲染模板可以通过 Map 或者 POJOnew HashMap<String, Object>() {{// 本地图片put("image", "/Users/dreamli/Workspace/MyRepository/javafamily/office-product/src/main/resources/static/jf.png");// 网络图片put("netImg", Pictures.of("https://img0.baidu.com/it/u=1114868985,1024067529&fm=253&fmt=auto&app=138&f=GIF?w=400&h=237").size(200, 200).center().create());// 图片流put("streamImg", Pictures.ofStream(new FileInputStream("/Users/dreamli/Workspace/MyRepository/javafamily/office-product/src/main/resources/static/jf.png"),PictureType.PNG).size(200, 200).center().create());// svgput("svgImg", "https://img.shields.io/badge/jdk-1.6%2B-orange.svg");// Java BufferedImagefinal BufferedImage bufImg = new BufferedImage(300, 300, TYPE_INT_RGB);final Graphics graphics = bufImg.getGraphics();graphics.setFont(new Font(null, Font.BOLD, 20));graphics.drawString("Buffered Image By Java", 10, 150);put("bufImg", Pictures.ofBufferedImage(bufImg, PictureType.PNG).create());}});// 输出文件
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));

4.3 查看

二、标签-表格

1. 表格标签

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

2. 数据模型

  • TableRenderData
{"rows": [  // 行数据{"cells": [ //单元格数据{"paragraphs": [ //   单元格内段落{"contents": [{[TextRenderData] // 单元格内文本},{[PictureRenderData] // 单元格内图片}],"paragraphStyle": null // 单元格内段落文本的样式:对齐}],"cellStyle": { // 单元格样式:垂直对齐方式,背景色"backgroundColor": "00000","vertAlign": "CENTER"}}],"rowStyle": { // 行样式:行高(单位cm)"height": 2.0f}}],"tableStyle": { // 表格样式:表格对齐、边框样式"width": 14.63f, // 表格宽度(单位cm),表格的最大宽度 = 页面宽度 - 页边距宽度 * 2,页面宽度为A4(20.99 * 29.6,页边距为3.18 * 2.54)的文档最大表格宽度14.63cm。"colWidths": null},"mergeRule": { // 单元格合并规则,比如第0行第0列至第1行第2列单元格合并"mapping": {"0-0": "1-2" }}
}

3. 示例

3.1 创建模板

3.2 渲染模板

// 模板文件
final ClassPathResource templateResource= new ClassPathResource("3tableTemplate.docx");XWPFTemplate template = XWPFTemplate// 编译模板.compile(templateResource.getInputStream())// 渲染模板.render(// 渲染模板可以通过 Map 或者 POJOnew HashMap<String, Object>() {{// 普通表格渲染put("table", Tables.of(new String[][] {new String[] { "组织", "管理员" },new String[] { "JavaFamily", "JackLi" }}).border(BorderStyle.DEFAULT).create());// 表格带样式渲染RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF").bgColor("4472C4").center().create();RowRenderData row1 = Rows.of("JackLi", "学士").center().create();put("tableStyle", Tables.create(row0, row1));// 合并单元格导出RowRenderData r0 = Rows.of("第一列", "第二列", "第三列").center().bgColor("4472C4").create();RowRenderData r1 = Rows.of("合并单元格", null, "数据").textColor("ff0000").textBold().create();MergeCellRule rule = MergeCellRule.builder().map(MergeCellRule.Grid.of(1, 0), // 开始合并的坐标MergeCellRule.Grid.of(1, 1)) // 结束合并的坐标.build();put("mergedTable", Tables.of(r0, r1).mergeRule(rule).create());}});

3.3 查看

4. 表格的高级特性

表格的高级特性需要通过 插件 实现,
而插件,又称为自定义函数,它允许用户在模板标签位置处执行预先定义好的函数。由于插件机制的存在,我们几乎可以在模板的任何位置执行任何操作。
插件是poi-tl的核心,默认的标签和引用标签都是通过插件加载。

这里先抛砖引玉通过表格对 poi-tl 的插件进行简单引进及介绍, 后面会对 poi-tl 插件 进行详细介绍.

4.1 循环表格

表格行循环通过 LoopRowTableRenderPolicy 策略, LoopRowTableRenderPolicy 是一个特定场景的插件,根据集合数据循环表格行。
当然, 列循环也完全没有问题, 通过 LoopColumnTableRenderPolicy.

4.2 创建模板

4.3 渲染文档

// 模板文件
final ClassPathResource templateResource= new ClassPathResource("3tableTemplate2_loop.docx");List<LoopItemVo> data = Arrays.asList(LoopItemVo.builder().loopName("张三").loopAge(12).build(),LoopItemVo.builder().loopName("李四").loopAge(24).build(),LoopItemVo.builder().loopName("王五").loopAge(36).build());// 指定循环行策略
LoopRowTableRenderPolicy rowPolicy= new LoopRowTableRenderPolicy();
// 指定循环列策略
LoopColumnTableRenderPolicy colPolicy= new LoopColumnTableRenderPolicy();Configure config = Configure.builder()// 绑定循环变量.bind("data", rowPolicy).bind("cols", colPolicy).build();XWPFTemplate template = XWPFTemplate// 编译模板, 应用自定义配置.compile(templateResource.getInputStream(), config)// 渲染模板.render(// 渲染模板可以通过 Map 或者 POJOnew HashMap<String, Object>() {{// 演示程序, 两个表格用同一份数据put("data", data);put("cols", data);}});

4.4 查看

三、下期继续

下期继续 poi-tl 标签的讲解, 包括: 有序/无序列表, 区块对, 图表等…下期再见, 拜了个拜!

Word 模板渲染引擎-Poi-tl - 标签(二)相关推荐

  1. poi-tl(word模板渲染)

    poi-tl(poi-template-language) 序言 方案 移植性 功能性 易用性 Poi-tl Java跨平台 Word模板引擎,基于Apache POI,提供更友好的API 低代码,准 ...

  2. html模板渲染引擎有什么作用

    你定义好一个模板.最简单的例子,例如<html> <div>{$what}</div> </html> 这只是一个模板.{$what}是数据.此时不知道 ...

  3. laytpl v1.1 独立版本 js模板渲染引擎

    案例一: 数据 var data = {title: '前端圈',intro: '一群码js的骚年,幻想改变世界,却被世界改变.',list: [{name: '贤心', city: '杭州'}, { ...

  4. poi tl 判断空值_poi-tl

    poi-tl(poi-template-language) Word 模板引擎,基于Apache POI - the Java API for Microsoft Documents. What is ...

  5. Django的模板渲染(render)机制

    2019独角兽企业重金招聘Python工程师标准>>> 一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context 是一系列变量和它们值的 ...

  6. OSG三维渲染引擎编程学习(全系列开展OSG学习)

    目录 第一章:OpenSceneGraph介绍 第二章:OSG数学基础 第三章:OSG场景组织 第四章:OSG几何体绘制 第五章:OSG场景渲染 第六章:OSG场景工作机制 第七章:OSG场景图形交互 ...

  7. poi tl 判断空值_使用poi-tl操作word模板

    使用poi-tl操作word模板 1.导入jar包支持 com.deepoove poi-tl 1.8.2 2.建立word模板 在电脑E盘中建立word模板:"E:\templete.do ...

  8. Java Word模板引擎-Poi-tl

    本文内容从Poi-tl官方文档摘录,poi-tl是一个基于Java POI的Word模板引擎,有着非常强大的功能 此处只摘录了一些我现在需要用到的功能 文章目录 一.简单示例 1.准备一个模板文档 ` ...

  9. 排名第一的word模板引擎,到底有多神仙

    hello大家好,今天我要给大家推荐一个非常棒的Word专用的模板引擎,Poi-tl(Poi-template-language).这款引擎基于Apache Poi,可以根据用户输入的内容直接生成相应 ...

最新文章

  1. 图解 i++ 和 ++i 的区别,看完不懂你顺着网线来揍我!
  2. 归并排序 java实现_归并排序的java实现
  3. Java多线程 - AQS详解
  4. python组合数等于一个值_Python如何实现随机组合结果元组重复数量不能超过某个值?...
  5. 南达科他州立大学计算机科学,关于举行南达科他州立大学Srinivas Janaswamy博士学术报告的通知...
  6. “AlphaGo之父”获最新一届ACM计算奖
  7. php简单网页制作代码,用HTML和CSS以及JS制作简单的网页菜单界面的代码
  8. 基于深度学习的异构时序事件患者数据表示学习框架
  9. wow工程修理机器人图纸_工程的修理机器人图纸是哪里弄来的……
  10. 前端精英你是什么样的呢
  11. 使用JS禁用浏览器后退按钮
  12. Windows下搭建GCC + Eclipse + OpenOCD的ARM开发环境
  13. 提高IT团队工作效率的建议
  14. 136 137 260只出现一次的数字【我亦无他唯手熟尔】
  15. PHP容器--Pimple运行流程浅析
  16. 中小软件企业管理存在的问题
  17. boss直聘python_爬Boss直聘,分析2019下半年Python工作现状
  18. [工具推荐]_iOS音频批量转换
  19. 洛谷Java入门级代码
  20. 知识分享之Golang——go-i18n国际化组件

热门文章

  1. OpenCV4学习笔记(58)——二维码检测与识别
  2. 像5D动感影院这种新兴的熊十一观影场所你都了解吗?
  3. 网站被挂码处理,百度等搜索引擎点击跳转其它赌博黄色等网站
  4. 谷歌打不开?谷歌在华遭遇至今最大规模屏蔽
  5. Dell 服务器 无线网卡,家庭无线互联方案:DELL 戴尔 发布 WiGig无线坞
  6. Linux 不重启添加SCSI硬盘方法
  7. IDE SATA SCSI 三种常见硬盘之间的区别(二)
  8. 搜索小技巧,八大搜索技巧
  9. 有趣的网站:河蟹娱乐
  10. redis分布式锁unlock方法