这篇博客是把数据库中的数据在后端拼装成word,下载到本地电脑,不是下载到用户端,如果想看保存到用户端的请前往SpringBoot以freemarker为word的模板下载文件到用户端(2) 区别就是下载到本地的直接到电脑了,下载到用户端的是下载到浏览器上,
存储的地方也不一样,下载到本地的你可以指定位置,而下载到用户端的直接看浏览器的存储位置在哪里
其实网上有很多这样的教程
springboot使用freemarker模板生成word文档这篇文章就可以,
一、但是因为升级版本问题,有些已经过时了
1、创建配置实例
下面这个创建配置实例的已经被删除了,
Configuration configuration = new Configuration();
所以要用新的
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
官网解释:配置设置
2、语言设置
原来模板和数据模型合并是
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));
现在要改成下面这个
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));
3、当发现没有此文件就创建
原来是
//如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
}
但是你会发现会有黄色背景覆盖在mkdirs
上,显示的是被忽略,不能忍
原因是它有返回值,你加一个判断就行,
我是这样写的:这样如果没有创建成功会写到日志上去
//如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()) {
if (!outFile.getParentFile().mkdirs()) {
log.error("创建文件失败");
}
;
}
4、建议
关闭流操作建议在finally{ }
里进行操作
二、用法上一些细节的介绍,可能会有疑惑
1、createWord上的Map参数
传过来的map
里面存储的是你要往模板上填的数据,可能有点难理解,
用个例子
在你要填的是model.ftl
,里面有一个${num}
,你就需要往map.put("num",1)
,这样它就会填上,如果你有感觉的话,可以认为map和model实现的功能差不多,
就算是传的是对象,比如Student对象,也是一样的。
2、createWord中加载模板
这个定位的是你要填的model.ftl的位置,因为我用的是springboot,我放在了templates文件夹下,因为是基于类路径来找的
Configuration configuration = new Configuration();
configuration .setClassForTemplateLoading(WordUtil.class, "/templates");
configuration .getTemplate("model.ftl");
最终会执行下面这个代码
WordUtil.class.getClassLoader().getResource("/template/");
所以ClassForTemplateLoading
的第二个参数一定要是/
开头,是文件夹的路径,如果你的model.ftl放在templates/down
下的话ClassForTemplateLoading
的第二个参数就是/templates/down