SpringBoot 项目使用easypoi实现导出word功能:
获取数据录入到固定的word模板,最后生成新的word文档。
查找多方资料,进行实践,使用easypoi实现了word的导出功能。对其实现做下整理。
easypoi官方文档:http://easypoi.mydoc.io/#category_49974
<!-- word导出 方式二:easypoi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.0.3</version>
</dependency>
package com.example.mimiprogram.common;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;
import cn.afterturn.easypoi.word.WordExportUtil;
/**
* word工具类
* easypoi官方文档:http://easypoi.mydoc.io/#category_49974
*/
public class WordUtil2 {
/**
* 导出word
* 第一步生成替换后的word文件,只支持docx
* 第二步下载生成的文件
* 第三步删除生成的临时文件
* 模版变量中变量格式:{{foo}}
* @param templatePath word模板地址
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
Assert.notNull(templatePath,"模板路径不能为空");
Assert.notNull(temDir,"临时文件路径不能为空");
Assert.notNull(fileName,"导出文件名不能为空");
Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
if (!temDir.endsWith("/")){
temDir = temDir + File.separator;
}
File dir = new File(temDir);
if (!dir.exists()) {
dir.mkdirs();
}
try {
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
}
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
String tmpPath = temDir + fileName;
FileOutputStream fos = new FileOutputStream(tmpPath);
doc.write(fos);
// 设置强制下载不打开
response.setContentType("application/force-download");
// 设置文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
OutputStream out = response.getOutputStream();
doc.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
delFileWord(temDir,fileName);//这一步看具体需求,要不要删
}
}
/**
* 删除零时生成的文件
*/
public static void delFileWord(String filePath, String fileName) {
File file = new File(filePath + fileName);
File file1 = new File(filePath);
file.delete();
file1.delete();
}
}
1.word模板存放项目位置
2.确定临时生成文件的存放路径(下载到指定位置时需要此步
)
String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址
3.创建controller进行调用
package com.example.mimiprogram.controller;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.deepoove.poi.data.PictureRenderData;
import com.example.mimiprogram.common.WordUtil;
import com.example.mimiprogram.common.WordUtil2;
import cn.afterturn.easypoi.word.entity.WordImageEntity;
/**
* 导出Word
* @author Administrator
*
*/
@RequestMapping("/auth/exportWord/")
@RestController
public class ExportWordController {
/**
* 用户信息导出word --- easypoi
* @throws IOException
*/
@RequestMapping("/exportUserWord2")
public void exportUserWord2(HttpServletRequest request,HttpServletResponse response) throws IOException{
Map<String, Object> params = new HashMap<>();
/*//如果word模板地址放在 webapp下采用如下方式获取word模板路径:
//表示到项目的根目录(webapp)下,要是想到目录下的子文件夹,修改"/"即可
String path = request.getSession().getServletContext().getRealPath("/");*/
//word模板地址放在src/main/resources/下,因为配置过静态资源映射,所以采用如下方式获取项目中的word模板地址:
String templatePath ="static/template/user2.docx";//word模板地址
// 渲染文本
params.put("name", "张三");
params.put("position", "开发工程师");
params.put("entry_time", "2020-07-30");
params.put("province", "江苏省");
params.put("city", "南京市");
// 渲染图片
WordImageEntity image = new WordImageEntity();
image.setHeight(120);
image.setWidth(120);
image.setUrl("D:\\cssTest\\square.png");
image.setType(WordImageEntity.URL);
params.put("picture", image);
// TODO 渲染其他类型的数据请参考官方文档
String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址
//生成文件名
Long time = new Date().getTime();
// 生成的word格式
String formatSuffix = ".docx";
// 拼接后的文件名
String fileName = time + formatSuffix;//文件名 带后缀
//导出word
WordUtil2.exportWord(templatePath, temDir, fileName, params, request, response);
}
}
注意:图片格式需要特殊处理
与 poi-tl的处理区分开
// 渲染图片
WordImageEntity image = new WordImageEntity();
image.setHeight(120);
image.setWidth(120);
image.setUrl("D:\\cssTest\\square.png");
image.setType(WordImageEntity.URL);
params.put("picture", image);
4.新建一个word,编写word模板:
注意区分:
easypoi:word模板的文本格式填充项 是 {{}},图片也是 {{}}
poi-tl:word模板的文本格式填充项是{{}},而图片是 {{@}}
5.jsp部分代码:
<a href="#" onclick="doExport2();">导出</a>
function doExport2(){
window.location.href="<%=basePath%>/auth/exportWord/exportUserWord2";
}
6.导出结果:
资料:
https://www.freesion.com/article/5126592287/
https://www.jianshu.com/0a40b90cc72c/