前言:
导出word的需求其实在日常工作中用到的地方还不少,于是想写一篇文章好好记录一下,在导出之前,需要了解一下关于浏览器如何处理servlet的后台数据。具体可以了解一下http通信下载行为在servlet的实现。
==导出的工具类代码来源于网络,如有侵权可以联系我删除文章==
个人使用==ftl==作为word导出模板引擎,有很多模板引擎可以选,个人经过查阅资料发现ftl用的比较多,所以选择这一种
<!-- more -->
码云地址:
文章牵扯代码比较多,如果要看具操作可以查看我自己瞎弄的一个码云地址:
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 数据,需要对应模板的占位符,否则会出错
* home.php?mod=space&uid=952169 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;
/**
* <p>
* 从网络上根据资料找到的一个工具类
* 主要以freemarker 为核心的模板生成word文档的工具类
* 这里默认配置了固定路径
* 需要根据路径取到对应模板
* 请求参数需要设置对应的模板名称
* home.php?mod=space&uid=686208
* @className: WordGeneratorUtils
* @description: 文档生成工具类
* </p>
* version: V1.0.0
*/
public final class WordGeneratorUtil {
private static Configuration configuration = null;
private static Map<String, Template> allTemplates = null;
private static final String TEMPLATE_URL = "/templates";
/**
* 模板常量类配置
*/
public static final class FreemarkerTemplate {
public static final String Test = "test";
public static final String REPORT = "report";
public static final String REC_RECOMMEND = "recRecommend";
}
static {
configuration = new Configuration(Configuration.VERSION_2_3_28);
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(WordGeneratorUtil.class, TEMPLATE_URL);
allTemplates = new HashMap(4);
try {
// 注意初始化要载入对应模板
allTemplates.put(Freema