需求:项目要求在检测过程完成后可导出相应的检测报告。
准备ftl模板
制作过程为:
- 将word文档另存为.xml格式
- 将xml后缀改为ftl后缀
- 修改插值,将变量部分改为${ varName }的格式。
如下图所示:
image.png
注意:
- 有可能出现插值变量的{}分割的情况,要手动调整,保证${ varName }在一个标签内
- 转储乱码,编码格式不一致,需要转码
- 这里只列了单个插值,如果结合到循环判断等语法,需要对标签有一点熟悉程度
freemarker手册 http://freemarker.foofun.cn/
将数据导入模板
数据格式为Map,key就是模板里的插值名称,如果缺少模板里的插值名称,控制台会报错(freemarker的报错一般比较好定位,都会指明原因和位置)。
/**
* 将data写入模板
* @param templetePath:模板文件路径
* @param templeteName:模板文件名
* @param filename:目标文件名
* @param data:要写入模板文件的数据
*/
public File writeAnnualReport(String templetePath, String templeteName, String filename, Map<String, Object> data) {
/**
* 加载模板
*/
File file = new File(filename);
try {
//设置模板加载路径
configuration.setDirectoryForTemplateLoading(new File(templetePath));
Template templete = configuration.getTemplate(templeteName);
//构造一个向目标文件写的流
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
//将数据填充到模板并写入目标文件
templete.process(data, writer);
//写完关闭流
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return file;
}
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
configuration的初始化貌似有新的方法,IDE指出方法过时,不过这样也能用。
导出报告
这里已经拿到file内容了,剩下的就是传给前端,项目里有下载文件接口的,也可以把文件放到固定的目录下。
实现下载接口就不赘述了,就是向response里写入数据,前端接收是Blob数据,下载用隐式a.href = 下载接口完成。
网友评论