续上一期的更新内容 ,导出的是单张图片,直接在路径的src 里面填写对应的占位符,就可以了,随着需求的变化,那么今天我们继续往下写一个循环导出多张图片到word里面。
使用FreeMarker导出word文档(支持导出单张图片)
首先我们需要进行在word 里面把对应的模版设置好。
设置好点击另存为,目前我用的html 格式的,网上也有很多xml 形式的,每种写法还不一样
接着我们用记事本进行打开,第一步一定要先修改编码格式为utf-8的
然后我们将html 中head中的标签全部,如果编码不修改,head标签不删除,将来导出的时候就是乱码,这个坑是很深的,排查了好长时间才解决。
这些都修改好后,我们点击另存为将这个模版改成后缀为ftl形式的
接下来我们就开始编写代码
@Override
public void exporttdYsdWord(HttpServletRequest request,
HttpServletResponse response, String objId, String gllx) {
List
图片的格式高宽度提前在代码里面设置好,然后我们在模版里面用一个占位符来进行替代就可以了。
设置下载格式
public static void exportWorde(HttpServletRequest request,
HttpServletResponse response, Map map,
String templateName, String fileName) throws IOException {
String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");
logger.info("获取到的模板路径是:templetePath------->" + pathString);
configuration.setDirectoryForTemplateLoading(new File(pathString));
Template freemarkerTemplate = configuration.getTemplate(templateName);
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoce(map,freemarkerTemplate);
fin = new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
fileName = fileName + DateUtil.currentDateToString() + ".doc";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
out = response.getOutputStream();
byte[] buffer = new byte[512]; // 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if(fin != null) fin.close();
if(out != null) out.close();
if(file != null) file.delete(); // 删除临时文件
}
}
设置编码:
private static File createDoce(Map dataMap, Template template) {
String name = ".doc";
File f = new File(name);
Template t = template;
try {
// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
t.process(dataMap, w);
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
导出效果
若本文对你有所帮助,请一键三连,说不定后期工作中就用到了。