1.导入poi坐标
```java
<!-- word -->
<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>
```
2.创建导出word 工具类(可自行修改导出工具类,我这里就将临时文件注释掉了)。注意这里一定要设置,不然会报其他异常。 **response.setContentType("application/msword");//导出word格式**
```java
`public class ExportWordUtils {
/**
* 导出word
* <p>第一步生成替换后的word文件,只支持docx</p>
* <p>第二步下载生成的文件</p>
* <p>第三步删除生成的临时文件</p>
* 模版变量中变量格式:{<!-- -->{foo}}
* @param templatePath word模板地址
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
public static void exportWord(InputStream templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
// AssertUtil.isNotNull(templatePath,"模板路径不能为空");
AssertUtil.isNotNull(temDir,"临时文件路径不能为空");
AssertUtil.isNotNull(fileName,"导出文件名不能为空");
AssertUtil.isNotTrue(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");
}
MyXWPFDocument doc = new MyXWPFDocument(templatePath);
WordExportUtil.exportWord07(doc, params);
//XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
// 临时文件暂时注释掉
/* String tmpPath = temDir + fileName;
FileOutputStream fos = new FileOutputStream(tmpPath);
doc.write(fos);*/
// 设置强制下载不打开
request.setCharacterEncoding("utf-8");
response.setContentType("application/msword");//导出word格式
//response.setContentType("application/force-download");
response.addHeader("Content-Disposition", "attachment;filename=" +
new String((fileName).getBytes(),
"UTF-8"));
// 设置文件名
// 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();
}
}
```
3.将模板引入到项目中,注意存放的位置,一般都是在resources底下。
模板有两种方式,一种是直接放在项目中,另一种是读取服务器中的地址,该案例演示的是放在项目中。
读取服务器的话需要将下载工具类路径改为String 类型。然后修改下载demo中的filePath为文件所在路径。
4.创建测试类,进行接口测试;注意模板路径一定要在word前加上/,这样才能找到模板,不让路径会报空指针异常。
```java
@ApiOperation(value = "word模板下载", notes = "word模板下载")
@GetMapping("/word/demo/export")
public void wordExport(HttpServletRequest request, HttpServletResponse response) throws IOException {
Map<String,Object> params = new HashMap<>();
params.put("title","这是标题");
params.put("name","张三");
//模板路径
// String filePath = "C:\\Users\\DELL\\Desktop\\demo.docx";
String filePath = "/word/demo.docx";
InputStream is = this.getClass().getResourceAsStream(filePath);
//这里是我说的一行代码
ExportWordUtils.exportWord(is,"D:/test","aaa.docx",params,request,response);
}
```
5.后记:实际下载中的问题,在测试的时候导出的文件一直是response,后来才发现要在pom 文件中加入不编译的功能。
```java
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
```
以上整体word下载基本功能完成。