目录
第一步:创建Word模板
创建需要的模板
另存为:单一网页文件
文件名最好改为英文,防止后续因编码格式导出失败
经过上面几步操作得到如下文件
将这个文件放入模板
打开刚才移入的文件里面有很多标签,我们不需要关注那么多,只需要ctrl+f 搜索我们刚才在word写入的内容就可以,找到这个位置
使用freemaker语法替换内容
到此模板已经搞定!~
第二步:整理好数据,核对好数据要填充的位置
map的key要与模板所要替换的内容名称一致
public void exportDoc(@PathVariable("id") Integer pid,HttpServletResponse response) throws Exception {
//查询所有标题和内容
List<BulletinDzh> list = query(pid);
String name = list.get(0).getName();
list.get(0).setName(null);
Map<String, Object> dataMap = new HashMap<>(16);
dataMap.put("list", list);
dataMap.put("name",name);
FileUtils.freemarkerExport(
"E:\\idea_Project\\nanhang\\xqyp\\src\\main\\resources\\code",
"export.mht",
dataMap,
"E:\\idea_Project\\nanhang\\xqyp\\src\\main\\resources\\code",name+".docx",response);
}
第三步:使用工具类生成word文件
FileUtils.freemarkerExport(
//模板文件所在的路径
"E:\\idea_Project\\nanhang\\xqyp\\src\\main\\resources\\code",
//模板文件的名称
"export.mht",
//整理好的数据
dataMap,
//生成的word文件存放位置
"E:\\idea_Project\\nanhang\\xqyp\\src\\main\\resources\\code",name+".docx",response);
至此,使用freemarker模板引擎导出word文件已经成功!~
注意:如果数据有样式,导出的数据也是会带有样式.如下图所示
工具类:
package com.sinosoft.springbootplus.emergencyrescue.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;
/**
* @author lzf
* @date 2022-08-25-15:51
*/
public class FileUtils {
/**
* 使用 freemarker 生成word文档
*
* @param templateDir 模板所在目录路径
* @param templateName 模板 例如:xxx.ftl
* @param data 数据
* @param fileSavePath 文档生成后,存放的路径
* @param filename 生成后的文件名称,使用英文
* @param response
* @throws Exception
*/
public static void freemarkerExport(String templateDir, String templateName, Map<String, Object> data, String fileSavePath, String filename, HttpServletResponse response) throws Exception {
// 1.设置 freeMarker的版本和编码格式
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
// 2.设置 freeMarker生成Word文档,所需要的模板的路径
configuration.setDirectoryForTemplateLoading(new File(templateDir));
// 3.设置 freeMarker生成Word文档所需要的模板 ---> xxx.ftl
Template t = null;
try {
// 模板文件名称
t = configuration.getTemplate(templateName);
} catch (IOException e) {
throw new IOException("获取 ftl模板失败!" + e.getMessage());
}
// 4.生成 Word文档的全路径名称
File outFile = new File(fileSavePath + filename);
// 5.创建一个 Word文档的输出流
Writer writer = null;
try {
writer = new OutputStreamWriter(new FileOutputStream(outFile), "utf-8");
} catch (Exception e) {
throw new Exception(e.getMessage());
}
try {
// 6.装载数据
t.process(data, writer);
response.setCharacterEncoding("utf-8");
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
response.setContentType("application/force-download");
// 7.读取生成好的 Word文档
File file = new File(fileSavePath + filename);
FileInputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
int length;
while ((length = is.read(b)) > 0) {
os.write(b, 0, length);
}
os.flush();
os.close();
writer.flush();
writer.close();
} catch (IOException e) {
throw new IOException(e.getMessage());
} finally {
deleteTempFile(fileSavePath + filename);
}
}
/**
* 删除临时生成的文件
*/
public static void deleteTempFile(String filePath) {
File f = new File(filePath);
f.delete();
}
}