Java利用freemarker生成word报告


需求:项目要求在检测过程完成后可导出相应的检测报告。

准备ftl模板

制作过程为:

  1. 将word文档另存为.xml格式
  2. 将xml后缀改为ftl后缀
  3. 修改插值,将变量部分改为${ varName }的格式。

如下图所示:
freemarker插值.png
注意:

  1. 有可能出现插值变量的{}分割的情况,要手动调整,保证${ varName }在一个标签内
  2. 转储乱码,编码格式不一致,需要转码
  3. 这里只列了单个插值,如果结合到循环判断等语法,需要对标签有一点熟悉程度

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 = 下载接口完成。


文章作者: kinoko
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kinoko !
  目录