使用poi-tl导出word文件的几个技巧
1、前言
Poi-tl提供了基于word模板文件导出word文件的功能。文档地址:http://deepoove.com/poi-tl/。
用下来,总体感觉还是很方便的。但使用过程,有几个细节,值得记叙。
2、关于复选框
有一组文字,每个词前面有复选框,根据值的不同,可以打勾,也可以不打勾。
表现如下:

勾选/不勾选在word中使用符号,即Wingdings 2字体。通过查Wingdings 2表:
勾选框:字符代码为0x0052,对应键盘字符R。
不勾选框:字符代码为0x00A3,由于超过ASCII码表值,没有对应键盘字符。
模板脚本:
{{actionItem0}}聚餐 {{actionItem1}}轰趴 {{actionItem2}}郊游 {{actionItem3}}唱歌
Spring Boot代码:
// 字体Wingdings 2的符号
TextRenderData selSymbol = new TextRenderData("R",new Style("Wingdings 2",10.5));
TextRenderData unselSymbol = new TextRenderData("\u00A3",new Style("Wingdings 2",10.5));
int actionItem = actionInfo.getActionItem();
String fieldName = "";
for(int i = 0; i < 4; i++) {
fieldName = "actionItem" + i;
int bitValue = (actionItem >> i) & 0x01;
if (bitValue == 1) {
datas.put(fieldName, selSymbol);
}else {
datas.put(fieldName, unselSymbol);
}
}
4个选项,使用bitmap编码,bit0表示是否聚餐,bit1表示是否轰趴,bit2表示是否郊游,bit3表示是否唱歌。
然后,就可以输出word文件了。
// 配置
Configure config = Configure.builder()
.useSpringEL()
.build();
XWPFTemplate template = XWPFTemplate.compile(wordTemplate,config).render(datas);
template.writeAndClose(new FileOutputStream(outputFile));
3、关于图片列表
如果单个图片,模板文件中使用{{@var}}即可输出,但如果是一个列表,就需要用区块对,然后怎样显示图片对象呢?例子中只有文本列表使用{{=#this}}表示文本项。经试验,用{{@#this}}表示图片项。
模板文件:
{{?imgList}}{{@#this}} {{/imgList}}
注意:{{@#this}}后面有一个空格,支持水平排列。
Spring Boot代码:
// 获取图片路径列表
List<String> imgPathList = getImgPathList();
// 输出的图片对象列表
List<PictureRenderData> imgList = new ArrayList<PictureRenderData>();
File imgFile=null;
FileInputStream imgInputStream=null;
BufferedImage image=null;
for (int i =0; i < imgPathList.size(); i++){
String imgPath = imgPathList.get(i);
imgFile=new File(imgPath);
if(imgFile.exists()) {
imgInputStream=new FileInputStream(imgFile);
image= ImageIO.read(imgInputStream);
// 将java图片转成PictureRenderData类型对象
PictureRenderData picItem = Pictures.ofBufferedImage(image, PictureType.PNG).size(60, 50).create();
imgList.add(picItem);
}
}
datas.put("imgList",imgList);
这样,就可以正确显示图片列表了。
使用poi-tl导出word文件的几个技巧的更多相关文章
- 记录一下表格用poi的导出word
也是网上找的代码http://53873039oycg.iteye.com/blog/2152009,但是横向合并单元格没成功.只能用很蠢的办法建立了好多table public void fillT ...
- java导出word文件
java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...
- 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)
https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...
- java 实现poi方式读取word文件内容
1.下载poi的jar包 下载地址:https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz ...
- 【POI】导出xls文件报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
使用POI导出xls文件,由于数据过多,导致导出xls报错如下: The maximum number of cell styles was exceeded. You can define up t ...
- java中使用poi导入导出excel文件_并自定义日期格式
Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...
- vue项目前端导出word文件(bug解决)
摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档. 一.需要 ...
- java根据word模板导出word文件
1.word模板文件处理,如下图所示在word 文档中填值的地方写入占位变量 2.将word文档另存为xml文件.编辑如下图,找到填写的占位,修改为${bcrxm}格式 3.将文件后缀名改为.ftl文 ...
- FreeMark导出word文件
1.编辑好word 2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替 eg: 张强 替换为:${name} 注意:图片是很长的一个base64的字符,同样替换就好 比如替换 ...
- 【POI】导出excel文件,不生成中间文件,直接将内存中的数据创建对象下载到浏览器
不是从InputStream中read,然后outputStream再write @RequestMapping("download4Excel") public void dow ...
随机推荐
- C# +SQL 存储过程 实现系统数据权限审查AOP效果
背景: 1.C/S系统架构 2.前端 Extjs 3.后台C# 4.数据库SQL 前端通过ajAx请求与后台通信. 前端应用页面统一继承入口类 BasePage 应用页面 public partia ...
- ChatGPT3.5使用体验
优点 1.ChatGPT 能颠覆现有的搜索引擎(百度.谷歌). 2.ChatGPT 的交互体验非常好,满足"智能助手"这种工具. 3.如何使用好ChatCPT? 回到一个经典的问题 ...
- DataLeap 数据资产实战:如何实现存储优化?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 DataLeap 作为一站式数据中台套件,汇集了字节内部多年积累的数据集成.开发.运维.治理.资产.安全等全 ...
- 五月十四号java基础知识点
class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...
- smtp.office365.com 无法从传输连接中读取数据: net_io_connectionclosed
这几天发送邮件时突然会报一个错 无法从传输连接中读取数据:net_io_connectionclosed. 因使用的是 smtp.office365.com 经过查询,发现了这个 Recently, ...
- classmethod和staticmethod装饰器
""" 两个装饰器 @classmethod 把一个对象绑定的方法,修改成为一个类方法 1.在方法中仍然可以引用类中的静态变量 2.可以不用实例化对象,就直接使用类名在外 ...
- Kubernetes入门实践(Pods)
为了解决多应用联合运行的问题,同时还要不破坏容器的隔离,就要再对多个容器进行打包.Pod就是对容器的打包,里面的容器可以看成是一个整体,总是能一起调度.一起运行,绝不会出现分离的情况,而Pod属于Ku ...
- Kubernetes中使用Helm2的安全风险
参考 http://rui0.cn/archives/1573 英文文章 https://blog.ropnop.com/attacking-default-installs-of-helm-on- ...
- VUEX(状态管理)之憨憨篇
1.导入vuex包 import vuex from 'vuex' 2.注册vuex到vue中 vue.use(vuex) 3.new vuex.store() 得到一个数据存储对象 var stor ...
- [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection
Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...