pom.xml
<!--word操作工具类-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.7.3</version>
</dependency>
<!--poi对excel2007以上版本的支持 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
public class IOUtil {
/**
* 获取运行时类根目录路径
* @return 运行时类根目录路径
*/
public static String classesDirPath(){
Object object = new Object();
return object.getClass().getResource("/").getPath().replaceFirst( "/" , "" );
}
/**
* 获取运行时webapp目录路径
* @return 运行时webapp目录路径
*/
public static String webappDirPath(){
return classesDirPath().replaceAll( "WEB-INF/classes/" , "" );
}
}
package com.example.demoxxljob.file;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import liquibase.pro.packaged.S;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* Word导出工具类(将查询数据填充到模板导出)
*/
public class WordExportUtil {
/** 模板所在包 */
private static String TEMPLATE_PACKAGE = "wordTemplate/";
/**
* <p>
* 导出模板到输出流中
* <ul>
* <li> templateName —— 模板文件名称
* <ul>
* <li> 模板文件名称: book.docx
* <li> 入参: "book.docx"
* </ul>
* <li> dataMap —— 待填充数据
* dataMap一般与实体对应,其中key对应模板中占位符字符,如:
* <ul>
* <li> 实体类属性:String name = "张三";
* <li> 模板占位符:姓名:{{name}}
* </ul>
* <li> outStream —— 输出流,如:response.getOutputStream()
* </ul>
*</p>
* @param templateName 项目webapp/wordTemplate目录下模板文件名称
* @param dataMap 需要填充进模板的数据
* @param outStream 需要被写入的流
* @throws IOException
*/
public static void exportWordToStream(String templateName,
Map dataMap,
FileOutputStream outStream) throws IOException {
XWPFTemplate xwpfTemplate = null;
try{
// 配置
Configure config = Configure.newBuilder().build();
// 1. 在tomcat环境下模板存放于webapp时,读取webapp目录路径作为起点
// String path = IOUtil.webappDirPath();
// 2. 模板存放于Rsource路径下
// String path = IOUtil.classesDirPath();
// path = path + TEMPLATE_PACKAGE + templateName;
String docPath = "C:\\s\\file\\20220427\\proposal-meeting.docx";
InputStream stream = new FileInputStream(new File(docPath));
// 编译模板,填充数据
xwpfTemplate = XWPFTemplate
.compile(stream, config)
.render(dataMap);
xwpfTemplate.write(outStream);
}catch (IOException e){
throw new RuntimeException("生成文件失败!");
}finally {
if(xwpfTemplate != null){
xwpfTemplate.close();
}
}
}
public static void main(String[] args) throws IOException {
//方法一
// Map<String,Object> params = new HashMap<>();
// params.put("test1","塘头村");
// params.put("test2","2021-01-17");
// params.put("test3","抚州");
// params.put("test4","塘头村");
// params.put("test5","甘先生");
// params.put("test6","格格");
// params.put("test7","农村改革发展");
// //保存路径
// String path = "C:\\s\\file\\20220427\\file01.docx";
// //模板路径
// String templatePath = "C:\\s\\file\\20220427\\testdoc.docx";
// WordExportUtil.exportWordToPath(templatePath,params,path);
//方法二
// Map<String,Object> params = new HashMap<>();
// params.put("test1","塘头村");
// params.put("test2","2021-01-17");
// params.put("test3","抚州");
// params.put("test4","塘");
// params.put("test5","甘先生");
// params.put("test6","格格");
// params.put("test7","农村改革发展");
// FileOutputStream fs = new FileOutputStream("C:\\s\\file\\20220427\\file02.docx");
// String docPath = "C:\\s\\file\\20220427\\testdoc.docx";
// WordExportUtil.exportWordToStream(docPath,params,fs);
}
/**
* <p>
* 导出模板到输出指定路径
* <ul>
* <li> templatePath —— 路径+模板文件名称
* <ul>
* <li> 模板文件名称: book.docx
* <li> 入参: "路径/book.docx"
* </ul>
* <li> dataMap —— 待填充数据
* dataMap一般与实体对应,其中key对应模板中占位符字符,如:
* <ul>
* <li> 实体类属性:String name = "张三";
* <li> 模板占位符:姓名:{{name}}
* </ul>
* <li> destDirPath —— 目标存放目录,如:C:\Users\Joe\Desktop\
* </ul>
*</p>
* @param templatePath 项目webapp/wordTemplate目录下模板文件名称
* @param dataMap 需要填充进模板的数据
* @param destDirPath 目标存放目录
* @throws IOException
*/
public static void exportWordToPath( String templatePath,
Map dataMap,
String destDirPath) throws IOException {
XWPFTemplate xwpfTemplate = null;
try{
// 配置
Configure config = Configure.newBuilder().build();
// 1. 在tomcat环境下模板存放于webapp时,读取webapp目录路径作为起点
// String path = IOUtil.webappDirPath();
// 2. 模板存放于Rsource路径下
// String path = IOUtil.classesDirPath();
// path = path + TEMPLATE_PACKAGE + templateName;
// InputStream stream = new FileInputStream(new File(path));
InputStream stream = new FileInputStream(templatePath);
// 编译模板,填充数据
xwpfTemplate = XWPFTemplate
.compile(stream, config)
.render(dataMap);
xwpfTemplate.writeToFile(destDirPath);
}catch (IOException e){
throw new RuntimeException("生成文件失败!");
}finally {
if(xwpfTemplate != null){
xwpfTemplate.close();
}
}
}
}