一、创建word文档模板
1. 生成想要生成的word样式,保存为xml文件
2.修改为ftl文件,并用编辑器打开,将需要填入的地方用占位符表示
3.需要一些语法操作的地方,要使用ftl语法,具体参考ftl基础语法
这次用到了插入多张图片,因为图片数量不是固定的,通过对for循环遍历和if判断完成每4张图片换行,根据取余判断是否需要行标签
还有最重要的三个关键地方需要进行占位符替换
①
②
③ 此处是将原文档加入的图片base64码进行占位符替换
至此,文档模板制作完成了
二、用poi导出文档代码
1.设置为附件下载
2.用Map封装模板数据,此处以图片示例,图片需要传入base64码
3.加载模板(此处踩坑),读取模板时百度搜有三个方法,其中使用setClassForTemplateLoading时,本地可以读取成功,但是到测试环境则读不到模板,其他两种方法,也没试成功。其中还有“/”开头为绝对路径,没有“/”为相对路径的坑,最后改用setTemplateLoader解决问题,在resource下新建template文件夹放入模板文件
附上代码:
public Response exportNpsInformReportsDetails(String id, HttpServletResponse response) {
LogUtil.info("请求参数:" + id);
response.reset();
OutputStream out = null;
response.setContentType("application/x-msdownload");
try {
out = response.getOutputStream();
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("文件名称" + ".doc", "UTF-8"));
ExportWordSupport exportWordSupport = new ExportWordSupport();
Map<String, Object> dataMap = getExportMap(id, exportWordSupport);
exportWordSupport.createWord(dataMap, out);
} catch (Exception e) {
LogUtil.info("导出失败: " + e.getMessage());
return Response.responseCode(GlobalConst.ErroCode.SERVICE_EXPORT_ERROR, null);
} finally {
if (null != out) {
try {
out.close();
} catch (IOException e) {
LogUtil.error(e, "export");
}
}
}
return Response.responseCode(GlobalConst.ErroCode.SERVICE_SUCCESS, null);
}
```java
/**
* 导出举报详情数据
*
* @param id
* @return
*/
private Map<String, Object> getExportMap(String id, ExportWordSupport exportWordSupport) {
VideoReportEntity videoReportEntity = npsInformDao.queryNpsInformReportDetails(id);
LogUtil.info("详情数据: " + videoReportEntity);
Map<String, Object> dataMap = new HashMap<>();
if (VideoInformType.CONTENT.equals(videoReportEntity.getReportSort())) {
String reportTime = DateTimeUtil.formatTime(videoReportEntity.getReportTime(), DateTimeUtil.yyyyMMddHHmmss);
dataMap.put("reportTime", reportTime);
dataMap.put("userPhone", videoReportEntity.getUserPhone() == null? "": videoReportEntity.getUserPhone());
dataMap.put("contentTitle", videoReportEntity.getContentTitle() == null? "": videoReportEntity.getContentTitle());
dataMap.