前言:
导出word的需求其实在日常工作中用到的地方还不少,于是想写一篇文章好好记录一下,在导出之前,需要了解一下关于浏览器如何处理servlet的后台数据。具体可以了解一下http通信下载行为在servlet的实现。
导出的工具类代码来源于网络,如有侵权可以联系我删除文章
个人使用ftl作为word导出模板引擎,有很多模板引擎可以选,个人经过查阅资料发现ftl用的比较多,所以选择这一种
码云地址:
文章牵扯代码比较多,如果要看具操作可以查看我自己瞎弄的一个码云地址:
https://gitee.com/lazyTimes/interview.git
效果演示:
给了一个测试页面,临时写了一些脚本,可以作为参考(后续会贴Html代码进去)
点击提交,导出内容, 导出word
报告
导出之后,打开word内容为:
实现步骤 - 制作word模板
第一步 新建word,制作成果样板
将需要导出word的内容,先粘贴到一个新建的word文件里面
第二步 转存格式 -> xml
选择文件“另存为”,将格式设置为xml格式
第三步 格式化文件
将文件放到idea
或者支持格式化的软件里面,进行格式化,保存:
注意占位符要匹配
第四步:模板数据替换占位符
在word页面将需要导入数据的地方,替换占位符
需要注意内容处理的时候: ${ filename} 有可能被切割为多个部分,我们需要把多个切割部分,改为下面的样式
一定记得所有的改动之后,马上打开xml格式的word,确认是不是改崩了
上面的步骤完成,说明有一个word模板做好了
第五步:制作ftl文件,word模板成型
在项目里面新建一个ftl文件,同时需要在工具类中配置,同时把做好站位符操作的xml内容贴进去
代码实现 - 导出代码
工具类的配置如下:
WordGeneratorUtil.java
:
/** * 模板常量类配置 */public static final class FreemarkerTemplate {
public static final String REPORT = "report"; public static final String REC_RECOMMEND = "recRecommend"; // 增加你的模板文件名称:}
在静态的代码块里面,需要注入对应的模板配置
// 注意初始化要载入对应模板allTemplates.put(FreemarkerTemplate.REPORT, configuration.getTemplate(FreemarkerTemplate.REPORT + ".ftl"));allTemplates.put(FreemarkerTemplate.REC_RECOMMEND,configuration.getTemplate(FreemarkerTemplate.REC_RECOMMEND + ".ftl"));
在配置完成之后,导出的时候就可以找到对应的文件了
建立一个通用的导出方法:
/** * 创建doc 文档 * dataMap 数据,需要对应模板的占位符,否则会出错 * @param dataMap 数据 * @param wordName word 报表的名称 * @param freemarkerTemplateName 指定需要使用哪个freemarker模板 * @return */public static File createDoc(String freemarkerTemplateName, String wordName, Map<String, String> dataMap) {
try {
File f = new File(wordName); Template t = allTemplates.get(freemarkerTemplateName); // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开 Writer w = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8); t.process(dataMap, w); w.close(); return f; } catch (Exception ex) {
ex.printStackTrace(); throw new RuntimeException("生成word文档失败"); }}
工具类完整代码:
package com.zxd.interview.export;import freemarker.template.Configuration;import freemarker.template.Template;import org.springframework.util.CollectionUtils;import java.io.*;import java.nio.charset.StandardCharsets;import java.util.HashMap;import java.util.Map;/** * * 从网络上根据资料找到的一个工具类 * 主要以freemarker 为核心的模板生成word