poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,那么在实际的工作中,我们首先要通过maven仓库下载远程工具包:
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.1</version>
</dependency>
接下来可以按照官网:Poi-tl Documentation进行学习,而小编在这里主要为大家提供一些实际工作中对word打印模版的特殊用法,希望可以给各位小伙伴们一些帮助。
首先我们要定义我们word文档存放的位置和文档名称:
//这里我们定义文档存放的目录(可以在项目下新建文件夹用来存储)
private static final String TEMPLATEFILEPATH = "template/%s.docx";
//定义文档的名称
private static final String TEMPLATE = "test";
//读入word模板
ClassPathResource classPathResource =
new ClassPathResource(String.format(TEMPLATEFILEPATH, TEMPLATE));
//这里选择用流的方式来读入
InputStream inputStream = classPathResource.getInputStream();
//读取数据 可以是map、或者实体实体对象
Test test= TestService.queryById(id);
//获取当前用户信息
User user = userService.selectUserById(Test.getUserId());
test.setNickName(user.getNickName());
test.setEmailNum(user.getEmail());
test.setTelNum(user.getTelephone());
//定义map集合复制Test实体的属性和值
Map<String, Object> data = BeanCopyUtils.copyToMap(test);
//数据库存储的值通常用1234来代表我们的类型分类,我们可以通过判断来转化为数字所代表的类型用于后续的打印输出,并将转化后的值传入map集合中,方便后续的判断:
if (data.get("enterpriseType") != null) {
if (data.get("enterpriseType").toString().equals("1")) {
data.put("enterpriseType", "国有企业");
} else if (data.get("enterpriseType").toString().equals("2")) {
data.put("enterpriseType", "集体所有制");
}
需要打印时间则需要对时间进行处理:
String dateStr = DateUtil.format(test.getCreateTime(), "yyyy年MM月dd日");
转换成我们需要的日期,然后开始处理和渲染数据:
//渲染数据
XWPFTemplate template = XWPFTemplate.compile(inputStream).render(map);
//设置响应内容类型
// response.setContentType("application/msword;charset=UTF-8");
response.setContentType("application/octet-stream;charset=UTF-8");
//设置响应头 注意:英文文件名输出没有问题,中文需要转字符集
response.addHeader("Content-Disposition", "attachment;filename=" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".docx");
//输出流
OutputStream outputStream = response.getOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
//写入输出流
template.write(outputStream);
//冲刷
bufferedOutputStream.flush();
outputStream.flush();
PoitlIOUtils.closeQuietlyMulti(template, bufferedOutputStream, outputStream);
//关闭流
bufferedOutputStream.close();
outputStream.close();
接下来咱们看看word中需要怎么加入我们的元素:
咱们可以用{{}}来传入map集合中key的值,我们还可以对参数进行判断,这样可以让我们的word模版灵活起来,如:
{{?announce==true}}
投诉单位(人):{{UserName}}
投诉单位联系方式:{{telephone}}
投诉单位联系地址:{{address}}
{{/announce==true}}
对于图片、图表的插入以及参数控制,可以根据官网教程进行一步步操作就可以实现。
以上是小编对poi-tl的学习应用心得,希望给各位小伙伴们带来帮助,望各位小伙伴们多多支持,点点赞!