最近有个需求是导出一个报表页面,包括页面的echarts图表以及一些分析说明,导出的文件是word文件。记录下做法
1.先定义好一个word静态模板
模板中的动态数据用一个变量来替代,图片部分随便用一个图片,这样做的原因是先占位,因为word模板生成的ftl模板图片资源是有图片资源标签的,如果不先占位,到时候通过word生成的ftl模板就没有图片的标签
具体做法如下
1.做好静态模板:
2.然后把静态模板中的动态数据用变量占位
3.把用量变量占位后的word另存为xml文件
生成好xml文件后,使用editplus打开,在浏览器上找个格式转换工具将内容格式化在线代码格式化OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具,提供jsbin在线 CSS、JS 调试,在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器,MarkDown编译器等其他在线工具https://tool.oschina.net/codeformat/xml
4.把xml文件放到项目下templates目录下,改文件后缀为ftl文件
注意:这里的ftl文件是有需要修改的地方的,之前在word中定义的变量名可能会分离开了,这个时候需要自己检查下,把变量设置好
比如这里,我们定义的变量本来是topTenRuleData,已经被错开了,需要把下面的删除然后把变量补上
5.将ftl模板中图片和变量的处理
ftl中,变量格式是${变量名},图片是base64的数据,所以我们需要把变量加上${}包裹
图片也是一个变量,变量内容为base64,这里我们将生成的ftl中的图片内容删除,替换成变量
这里w:binData标签不要换行,以免出现问题
至此模板就完成了
代码部分
6.application.yml中配置freemarker的配置
指定ftl文件所在路径
7.工具类
package com.sunline.suncrs.dmvs.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;
import java.io.*;
import java.util.Map;
/**
* @author: yxb
* @date: 2022/3/11 9:16
* @version: v1.1
* @description:
*/
@Component
public class FreeMarkerUtils {
@Autowired
private FreeMarkerConfig freeMarkerConfig;
/**
* 生成word文件处理
* @param map
* @param templateName
*/
public File exportWord(String fileName,Map map, String templateName){
//request.getAttribute()
try {
Template template=freeMarkerConfig.getConfiguration().getTemplate(templateName);
File file=createDoc(fileName, map, template);
return file;
}catch (Exception ex){
ex.printStackTrace();
}
return null;
}
/**
* 创建临时word文件
* @param fileName
* @param map
* @param template
* @return
*/
private static File createDoc(String fileName,Map map,Template template){
File f=new File(fileName);
try {
Writer w=new OutputStreamWriter(new FileOutputStream(f),"utf-8");
template.process(map, w);
w.close();
}catch (Exception ex){
ex.printStackTrace();
}
return f;
}
}
根据自己业务,将ftl中的变量设置到Map中,
注意,ftl中的变量必须要在Map中,导出文件的后缀设置为doc,如果设置为docx,导出来的文件打不开
如果前端echarts图片转base64有问题的,请参考上一篇博客