使用poi-tl生成word(docx)文档,支持保存至本地;直接get请求下载;生成InputStream
参考官网地址: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相关推荐
- java用模板生成word(docx)文档(含动态表格)
生成word思路 用WPS或者office编辑好word的样式,然后另存为word xml文档,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Docx. 编 ...
- php实现生成word表格,TP5利用phpforword生成word表格文档
TP5利用phpforword生成word表格文档 2019-12-18 573 1.首先用composer安装下载 phpoffice/phpforwordcomposer require phpo ...
- python生成word目录_使用Python更新MS Word .docx文档的目录(目录)
我使用python包" python-docx"来修改MS Word .docx文档的结构和内容.该软件包无法更新TOC(目录)[Python: Create a "Ta ...
- 针对word.docx文档的关键词索引器
前言 之前曾想做这样一个工具,用来遍历目录下的word.docx文档查询关键词,主要是有几个目的: 1.在项目开始阶段,通过关键词检索feature,我脑子实在是记不住文档都在哪: 2.收尾阶段,检查 ...
- word模板生成word报表文档
主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...
- 用DELPHI怎样生成WORD表格文档
Delphi与Word之间的融合技术 一.VBA代码含义 Microsoft Word是一个集成化环境,是美国微软公司的字处理系统,但是它决不仅仅是一个字处 理系统, ...
- poi操作word docx文档内容替换详解
WORD文档文字替换 利用关键字下角标位置的方式处理word文档区域文字分割无法匹配的问题 /*** DOCX文档字符串查找** @param document 文档* @param str 查找字符 ...
- python 操作 word 文档,使用 python-docx 操作 word docx 文档
写在前面 python-docx 不支持 doc 文档,一定要注意该点,如果使用 doc 文档,需要提前将其用 Word 相关软件转换为 docx 格式. doc 和 docx 是存在本质差异的,一个 ...
- python读word文档计算字数,Python: Word(docx)文档词频统计
#该程序读入D:/data_temp下的所有docx文件,并实现词频统计 #输出每个文档的单词频数,并进行绘图 #docx import os import docx from pyecharts.c ...
最新文章
- linux基础(一)
- duilib控件的一些属性
- 思科网络基础配置命令大全(二)
- html5移动web开发实战必读书记
- jqGrid时间转换
- iOS开发--基于AFNetWorking3.0的图片缓存分析
- mac卸载python3.8_如何使用Homebrew在Mac上默认设置Python3.8?
- Windows蓝屏分析器WinDbg使用方法
- 《生命》第五集:Birds (鸟类)
- 线性代数:第五章 相似矩阵及二次型(2)二次型及其标准型 配平方法 合同变换法 正定二次型
- 固定linux虚拟机ip地址,虚拟机下linux 系统网卡配置、固定IP地址
- Mac中的文件如何拷贝到硬盘中?
- SSD硬盘安装win10 且安装千牛工作台频繁卡死问题解决过程
- The server time zone value 'EDT' is unrecognized or represents more than one time zone.
- python进行JB正态性检验
- hihoCoder 1095 HIHO Drinking Game 微软苏州校招笔试 12月27日
- 2019.10.13作业总结
- 嵌入式开发之davinci--- 8148/8168/8127 中的图像采集格式Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别...
- 给赞!移动端网页调试利器-uc开发者工具
- cctv android app,中央电视台 电视版