word中需要图片的地方插入图片,然后另存为xml,会生成一段base64编码,将文件中的编码替换成${变量}(接上一篇:word生成xml并改名为ftl)
util工具类改写:
public class FreeMarkWordUtils { private static final Logger logger = LoggerFactory.getLogger(WordUtils.class); private static final Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
/**
* 导出Word文件
*/
public static void exportToWord(String template, String docPath, Map<String, Object> dataMap, File dir, HttpServletResponse response) {
// ** 设置编码 **//*
configuration.setDefaultEncoding("UTF-8");
// 加载模板文件
Template t;
try {
response.setCharacterEncoding("utf-8");
//加载文档模板FTL文件所存在的位置
configuration.setDirectoryForTemplateLoading(dir);
t = configuration.getTemplate(template);
} catch (IOException e) {
logger.error(e.getMessage(), e);
throw new BaseException("io读写模板失败!");
}
ServletOutputStream out = null;
response.setContentType("application/msword");
// 指定输出word文件的路径
// 调用工具类WordUtils的createDoc方法生成Word文档
InputStreamSource file;
InputStream fin = null;
try {
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
// 文件名称
docPath = URLEncoder.encode(docPath, String.valueOf(StandardCharsets.UTF_8));
//设置浏览器以下载的方式处理该文件-下载文件名称乱码处理
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + docPath + ";" + "filename*=utf-8''" + docPath);
file = createDoc(dataMap, t);
fin = file.getInputStream();
out = response.getOutputStream();
// 缓冲区
byte[] buffer = new byte[1024];
int bytesToRead;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} catch (TemplateException | IOException e) {
logger.error(e.getMessage(), e);
throw new BaseException("文件读取失败!");
} finally {
try {
if (fin != null) {
fin.close();
}
if (out != null) {
out.close();
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
/**
* 创建word文件
*
* @param dataMap dataMap
* @param template template
* @return InputStreamSource
*/
public static InputStreamSource createDoc(Map<String, Object> dataMap, Template template) throws TemplateException, IOException {
//生成随机的合同名称
StringWriter out1 = new StringWriter();
Writer out = new BufferedWriter(out1, 10240);
//将数据输出到模板
template.process(dataMap, out);
out.close();
out1.close();
return new ByteArrayResource(out1.toString().getBytes(StandardCharsets.UTF_8));
}
}
//具体实现调用-导出word
public void exportSubFaultApplyFile(HttpServletResponse response, String applyId) {
//获取导出详情
Map<String, String> insertTextMap = this.baseMapper.querySubFaultApplyExportDetail(applyId);
//生成的word名称
String fileName = DateUtils.getDate() + StringConstants.SUB_FAULT_REPORT_DOC;
if (null != insertTextMap) {
//todo 获取审批历史记录
//获取故障附件详情
List<SubFaultFileVo> faultFileList = BeanCopyUtils.copyList(fileService.list(new LambdaQueryWrapper<SubFaultFile>().eq(SubFaultFile::getApplyId, applyId)), SubFaultFileVo.class);
//获取图片并转为doc存储模式
Map<String, String> pictureMap = getPictureFiles(faultFileList);
//处理word文档内数据
Map<String, Object> data = dealData(insertTextMap, pictureMap);
//ftl模板创建word文档
FreeMarkWordUtils.exportToWord(StringConstants.SUB_FAULT_REPORT_TEMPLATE_FTL, fileName, data, getTemplateDir(), response);
}
}