SpringBoot 项目使用poi-tl实现导出word功能:
获取数据录入到固定的word模板,最后生成新的word文档。
Poi-tl官方文档:http://deepoove.com/poi-tl/
根据word模板,动态填充模板内容,生成新的word。
poi-tl(poi template language)是Word模板引擎
,基于Microsoft Word模板和数据生成新的文档。
Apache POI不仅在上层封装了易用的文档API(文本、图片、表格、页眉、页脚、图表等),也可以在底层直接操作文档XML结构,poi-tl正是一个基于Apache POI的Word模板引擎
,并且拥有着让人喜悦的特性。
总共就5种语法
:1.文本模板{{var}} 渲染为 TextRenderData 或 String 数据模型
2.图片模板{{@photo}} 渲染为 PictureRenderData 数据模型
3.表格模板{{#var}} 渲染数据模型是 MiniTableRenderData
4.列表模板{{*var}} 渲染为 NumbericRenderData 数据模型
5.文档模板{{+var}} 渲染为 DocxRenderData 数据模型
根据官方文档介绍,poi-tl具有以下优点:
A、支持动态填充文本、图片、表格、列表、文档
B、支持DOCX格式,所有的模板标签都是以 {{ 开头,以 }}结尾
,模板标签可以出现在任何非文本框的位置,包括页眉,页脚,表格内部等等。
C、poi-tl的一个核心特点是数据模型与样式的分离
,同样的数据模型可以用来渲染各种不同样式的模板。
D、文档的样式继承模板标签的样式
,即如果模板{{title}}是蓝色微软雅黑加粗四号字体,则替换后的文本也是蓝色微软雅黑加粗四号字体。
1.添加依赖
<!-- word导出 -->
<!-- poi-tl是基于Apache POI的Word模板引擎。poi-tl依赖的是poi3.16版本 -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.5.0</version>
</dependency>
2.创建word工具类
package com.example.mimiprogram.common;
import com.deepoove.poi.XWPFTemplate;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
/**
* word工具类
* Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/
*/
public class WordUtil {
/**
* 根据模板填充内容生成word,并下载
* @param templatePath word模板文件路径
* @param paramMap 替换的参数集合
*/
public static void downloadWord(OutputStream out,String templatePath, Map<String, Object> paramMap) {
Long time = new Date().getTime();
// 生成的word格式
String formatSuffix = ".docx";
// 拼接后的文件名
String fileName = time + formatSuffix;
//设置生成的文件存放路径,可以存放在你想要指定的路径里面
String rootPath="D:/mimi/"+File.separator+"file/word/";
String filePath = rootPath+fileName;
File newFile = new File(filePath);
//判断目标文件所在目录是否存在
if(!newFile.getParentFile().exists()){
//如果目标文件所在的目录不存在,则创建父目录
newFile.getParentFile().mkdirs();
}
// 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板(compile)+渲染数据(render)
XWPFTemplate template = XWPFTemplate.compile(templatePath).render(paramMap);
try {
//out = new FileOutputStream(filePath);//输出路径(下载到指定路径)
// 将填充之后的模板写入filePath
template.write(out);//将template写到OutputStream中
out.flush();
out.close();
template.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.新建一个word,编写word模板:
4.编写一个controller 类,导出员工信息的接口类,供页面请求
package com.example.mimiprogram.controller;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 导出Word
* @author Administrator
*
*/
@RequestMapping("/auth/exportWord/")
@RestController
public class ExportWordController {
/**
* 用户信息导出word
* @throws IOException
*/
@RequestMapping("/exportUserWord")
public void exportUserWord(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" +new SimpleDateFormat("yyyyMMddHHmm").format(new Date())+".docx");
Map<String, Object> params = new HashMap<>();
// 渲染文本
params.put("name", "张三");
params.put("position", "开发工程师");
params.put("entry_time", "2020-07-30");
params.put("province", "江苏省");
params.put("city", "南京市");
// 渲染图片
params.put("picture", new PictureRenderData(120, 120, "D:\\cssTest\\square.png"));
// TODO 渲染其他类型的数据请参考官方文档
String templatePath = "D:\\user.docx";
WordUtil.downloadWord(response.getOutputStream(), templatePath, params);
}
}
需要注意的是:
downloadWord方法中的一行代码:
out = new FileOutputStream(filePath);//输出路径(下载到指定路径)
exportUserWord方法中的两行代码:
//浏览器下载
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" +new SimpleDateFormat("yyyyMMddHHmm").format(new Date())+".docx");
如果想要显示浏览器下载
,exportUserWord方法中的这两行代码必须显示
,而downloadWord方法中的那一行代码必须隐藏
。
如果想要下载到指定的路径
,exportUserWord方法中的这两行代码必须隐藏,而downloadWord方法中的那一行代码必须显示。
5.jsp部分代码:
<a href="#" onclick="doExport();">导出</a>
function doExport(){
window.location.href="<%=basePath%>/auth/exportWord/exportUserWord";
}