参考官网地址:http://deepoove.com/poi-tl

一、引用jar包

1)引用jar包

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version>
</dependency>

2)poi-tl使用slf4j作为日志门面,你可以自由选择日志实现,比如logback、log4j等。我们以logback为例:

首先在项目中添加logback依赖:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

然后配置logback.xml文件,可以配置日志级别和格式:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><logger name="com.deepoove.poi" level="debug" additivity="false"><appender-ref ref="STDOUT" /></logger><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

debug级别的日志会打印解析渲染过程中的信息,有利于程序调试,另外在模板引擎执行结束后会打印耗时信息:

Successfully Render the template file in 13 millis

如果自己项目引用的 有log4j的话则不用引用,可能会报一个版本低的错误,则添加以下版本,强制使用高版本

 <properties><java.version>1.8</java.version><log4j2.version>2.17.2</log4j2.version></properties>

二、模版样式

1)需要替换的 文本 前面必须是 {{ 后面是}}

2)替换为图片的话,则字段前面加 @标识

3)如果需要循环增加表格数据,则在表格第一行开头加入{{集合字段名}},下面的对象字段 则用[] 包括

导出效果:

三、代码工具类(支持保存至本地;返回InputStream流;直接get请求下载)

package com.zjjw.jxtest.util.util;import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.core.io.ClassPathResource;import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;/*** @author: chenjiaxiang* @create: 2022/10/20 15:38**/public class PoiTlWordUtils {/*** 根据文件模版生成文件保存至本地** @param map      数据集合* @param nameList 循环添加的数据* @param path     模版路径 我放到了 项目的 resources/file 下面了* @param filePath 生成文件保存到本地的路径及文件名称*/public static void poiTlWord(Map<String, Object> map, List<String> nameList, String path, String filePath) {XWPFTemplate template;try {//处理文件template = common(path, map, nameList);//写出文件且关闭流template.writeAndClose(Files.newOutputStream(Paths.get(filePath)));} catch (IOException e) {throw new RuntimeException(e);}}/*** 根据word模版生成word文档并通过流的方式下载 get请求** @param map      数据集合* @param nameList 循环表格名称* @param path     模版文件路径* @param fileName 生成的文件名称* @param response response*/public static void poiTlWord(Map<String, Object> map, List<String> nameList, String path, String fileName, HttpServletResponse response) {OutputStream out = null;BufferedOutputStream bos = null;XWPFTemplate template;String filePoiName;try {//处理文件template = common(path, map, nameList);response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");filePoiName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + filePoiName + ".docx");out = response.getOutputStream();bos = new BufferedOutputStream(out);template.write(bos);bos.flush();out.flush();PoitlIOUtils.closeQuietlyMulti(template, bos, out);} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (bos != null) {bos.close();}if (out != null) {out.close();}} catch (IOException e) {throw new RuntimeException(e);}}}/*** 根据word模版生成文件 返回InputStream** @param map      数据* @param nameList 循环数据名称集合* @param path     模版文件位置* @return InputStream*/public static InputStream poiTlWord(Map<String, Object> map, List<String> nameList, String path) {ByteArrayOutputStream bos = null;XWPFTemplate template = null;try {//处理文件template = common(path, map, nameList);bos = new ByteArrayOutputStream();template.write(bos);return new ByteArrayInputStream(bos.toByteArray());} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (bos != null) {bos.close();}if (template != null) {template.close();}} catch (IOException e) {throw new RuntimeException(e);}}}/*** 公共处理模版数据** @param path     模版文件位置* @param map      数据* @param nameList 数据名字集合* @return 文档*/private static XWPFTemplate common(String path, Map<String, Object> map, List<String> nameList) {//获取模版文件的文件流ClassPathResource classPathResource = new ClassPathResource(path);XWPFTemplate template;InputStream ins = null;try {ins = classPathResource.getInputStream();if (CollectionUtils.isNotEmpty(nameList)) {//如果有循环添加的数据表格的话 则绑定LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();ConfigureBuilder builder = Configure.builder();nameList.forEach(l -> builder.bind(l, policy));Configure config = builder.build();template = XWPFTemplate.compile(ins, config).render(map);} else {template = XWPFTemplate.compile(ins).render(map);}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (ins != null) {ins.close();}} catch (IOException e) {throw new RuntimeException(e);}}return template;}}

使用poi-tl生成word(docx)文档,支持保存至本地;直接get请求下载;生成InputStream相关推荐

  1. java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式,然后另存为word xml文档,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Docx. 编 ...

  2. php实现生成word表格,TP5利用phpforword生成word表格文档

    TP5利用phpforword生成word表格文档 2019-12-18 573 1.首先用composer安装下载 phpoffice/phpforwordcomposer require phpo ...

  3. python生成word目录_使用Python更新MS Word .docx文档的目录(目录)

    我使用python包" python-docx"来修改MS Word .docx文档的结构和内容.该软件包无法更新TOC(目录)[Python: Create a "Ta ...

  4. 针对word.docx文档的关键词索引器

    前言 之前曾想做这样一个工具,用来遍历目录下的word.docx文档查询关键词,主要是有几个目的: 1.在项目开始阶段,通过关键词检索feature,我脑子实在是记不住文档都在哪: 2.收尾阶段,检查 ...

  5. word模板生成word报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  6. 用DELPHI怎样生成WORD表格文档

    Delphi与Word之间的融合技术      一.VBA代码含义      Microsoft   Word是一个集成化环境,是美国微软公司的字处理系统,但是它决不仅仅是一个字处      理系统, ...

  7. poi操作word docx文档内容替换详解

    WORD文档文字替换 利用关键字下角标位置的方式处理word文档区域文字分割无法匹配的问题 /*** DOCX文档字符串查找** @param document 文档* @param str 查找字符 ...

  8. python 操作 word 文档,使用 python-docx 操作 word docx 文档

    写在前面 python-docx 不支持 doc 文档,一定要注意该点,如果使用 doc 文档,需要提前将其用 Word 相关软件转换为 docx 格式. doc 和 docx 是存在本质差异的,一个 ...

  9. python读word文档计算字数,Python: Word(docx)文档词频统计

    #该程序读入D:/data_temp下的所有docx文件,并实现词频统计 #输出每个文档的单词频数,并进行绘图 #docx import os import docx from pyecharts.c ...

最新文章

  1. linux基础(一)
  2. duilib控件的一些属性
  3. 思科网络基础配置命令大全(二)
  4. html5移动web开发实战必读书记
  5. jqGrid时间转换
  6. iOS开发--基于AFNetWorking3.0的图片缓存分析
  7. mac卸载python3.8_如何使用Homebrew在Mac上默认设置Python3.8?
  8. Windows蓝屏分析器WinDbg使用方法
  9. 《生命》第五集:Birds (鸟类)
  10. 线性代数:第五章 相似矩阵及二次型(2)二次型及其标准型 配平方法 合同变换法 正定二次型
  11. 固定linux虚拟机ip地址,虚拟机下linux 系统网卡配置、固定IP地址
  12. Mac中的文件如何拷贝到硬盘中?
  13. SSD硬盘安装win10 且安装千牛工作台频繁卡死问题解决过程
  14. The server time zone value 'EDT' is unrecognized or represents more than one time zone.
  15. python进行JB正态性检验
  16. hihoCoder 1095 HIHO Drinking Game 微软苏州校招笔试 12月27日
  17. 2019.10.13作业总结
  18. 嵌入式开发之davinci--- 8148/8168/8127 中的图像采集格式Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别...
  19. 给赞!移动端网页调试利器-uc开发者工具
  20. cctv android app,中央电视台 电视版

热门文章

  1. 你了解Cisco的PVST、PVST+和Rapid-PVST+吗?
  2. python绘制国内生产总值散点图_用Python分析国民生产总值
  3. 卷积与Lenet(对卷积的再思考)
  4. tmux使用指南:5 :滚动与鼠标支持
  5. 基于scp的上传工具sscp
  6. 室内温湿度检测系统解决方案
  7. 工控安全漏洞数大爆发,我国企业要如何掘金?
  8. 计算机学生如何创新,如何在计算机教学中培养学生的创新能力
  9. SpringBoot购物推荐体育用品商城
  10. KubeSphere 虚拟化 KSV 安装体验