1、在jeecg-boot-parent的pom.xml中添加以下依赖:
<!-- easypoi 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的方法:
/**
- 导出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(String templatePath, String temDir, String fileName, Map 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();
}
}
3、将模板放入某一个文件夹下,模板中的变量用两个英文大括号{{}}包裹:

4、调用导出Word的方法:
public void exportSysStatistic(HttpServletRequest request, HttpServletResponse response) {
Map params =new HashMap<>();
params.put("year", year);
params.put("month", month);
params.put("day", day);
exportWord("static/tmp/statisticWord.docx","D:/export","word.docx", params, request, response);
}
5、在ShiroConfig.java中放开访问控制:
filterChainDefinitionMap.put("/analyze/**","anon");
6、调试,浏览器中直接输入接口地址(如 http://localhost:8080/jeecg-boot/analyze/exportSysStatistic)测试。
7、如果第6步自动下载不成功,则可能为模板生成后乱码(检查编译后在target目录下的子目录中生成的模板文件是否能正常打开),需要在配置文件中进行如下配置:

<!-- 避免font文件的二进制文件格式压缩破坏 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
<nonFilteredFileExtension>woff2</nonFilteredFileExtension>
<nonFilteredFileExtension>eot</nonFilteredFileExtension>
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
<nonFilteredFileExtension>svg</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
和
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/**/*.docx</include>
</includes>
</resource>
8、重新进行第6步操作,成功。
参考改编自:https://blog.csdn.net/weixin_34310785/article/details/89650505
实际代码(后端):
@RequestMapping(value = "downReport", method = RequestMethod.GET)
public void downReport(@RequestParam(name = "id", required = true) String id, HttpServletRequest request, HttpServletResponse response) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String curTime = format.format(new Date());
String templateFile = "classpath:download-templates/inspect-report.docx";
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = null;
resource = resourceLoader.getResource(templateFile);
log.info(this.uploadPath);
Map<String, Object> map = new HashMap<String, Object>();
map.put("s1", "北京石油化工科技有限责任公司");
map.put("s2", "北京石油化工科技有限责任公司");
map.put("s3", "北京石油化工科技有限责任公司");
map.put("s4", "被");
map.put("s5", "净");
for (int i = 6; i < 51; i++) {
map.put("s" + i, "test" + i);
}
try {
String pat = resource.getFile().getPath();
XWPFDocument doc = WordExportUtil.exportWord07(pat, map);
// FileOutputStream fos = new FileOutputStream(basePath + "自查及风险评估报告new.docx");
// doc.write(fos);
// fos.close();
response.setContentType("application/force-download");
response.addHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode("自查及风险评估报告.docx", "UTF-8"));
OutputStream out = response.getOutputStream();
doc.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
前后端分离的前端代码
downReport() {
this.$axios({
method: 'get',
url: `${this.url.downReport}?id=${this.inspectRow.id}`,
responseType: 'blob',
}).then((res) => {
if (res.type == 'application/force-download') {
if (!res) {
return
}
const url = window.URL.createObjectURL(res)
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', '责任自查风险评估.docx')
document.body.appendChild(link)
link.click()
this.$info('下载成功')
} else {
this.$error('下载失败')
}
})
},
其中第7步的maven配置很重要*