SpringBoot以freemarker为word的模板下载文件到本地(1)

这篇博客是把数据库中的数据在后端拼装成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),这样它就会填上,如果你有感觉的话,可以认为mapmodel实现的功能差不多,
就算是传的是对象,比如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

你可能感兴趣的:(springboot)