使用FreeMaker将数据库内容以指定文件格式导出

本文介绍如何使用FreMaker结合数据库内容生成Word文档的方法,包括模板制作、文件格式转换及代码实现等步骤。

使用FreeMaker将数据库内容以指定文件格式导出

1.首先你得有一个word模板,将需要填充的内容用占位符进行填充${括号里的值是后台创建map的key}

注意${}里面装的是一个list,那么list是map的key值,info对应list里面的属性,也就是你想循环打印的内容
在这里插入图片描述

2.将文件以xml的方式进行导出
在这里插入图片描述
3.然后放入idea中将文件后缀改为ftl结尾
在这里插入图片描述
4.注意ftl里面的格式有些不对需要手动调整,找到文件里面各个key的位置,可以ctrl+f快速定位
在这里插入图片描述

5.将${leader}中间多余的删除变成如下图
在这里插入图片描述

6.如果你 {}里面装的是list则需要循环删除多余的部分后,再整段的前后加上<#list 你map里Value为list的key as 这个as后面的随意相当于循环每个变量的名字> 但下面 也要改变${自己取的随意变量.属性}
在这里插入图片描述
7.开始代码编写

  //docMap装的是你数据库查出来的值
  Map docMap = new HashMap();
  docMap.put("dutyTime",dutyTime);
  docMap.put("list",maps);
  Writer out = null;
  FileInputStream in = null;
  //filePath是你文件的相对路径
  String filePath = "相对路径.doc";
   try {
            //Configuration 用于读取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.8"));
            configuration.setDefaultEncoding("utf-8");
            configuration.setDirectoryForTemplateLoading(new File("你把文件放到的文件夹的路劲"));
            //以utf-8的编码读取ftl文件
            Template template = configuration.getTemplate("dutyrecord.ftl", "utf-8");
            FileUtil.createFile(filePath);
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "utf-8"), 10240);
            //这一步就是填充内容
            template.process(docMap, out);
            //下载文件
           downOneFile(filePath);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(out);
        }
  public void downOneFile(String fileName) throws Exception {
        HttpServletResponse resp = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        File file = new File("文件夹的相对路径" + fileName);
        if (file.exists()) {
            resp.setContentType("application/x-msdownload");
            resp.setHeader("Content-Disposition", "attachment;filename=" + new         String(fileName.getBytes(), "ISO-8859-1"));
            InputStream inputStream = new FileInputStream(file);
            ServletOutputStream ouputStream = resp.getOutputStream();
            byte b[] = new byte[1024];
            int n;
            while ((n = inputStream.read(b)) != -1) {
                ouputStream.write(b, 0, n);
            }
            ouputStream.close();
            inputStream.close();
        }
    }

最后的下载功能因个人而异,发现错误多多包涵。

Freemarker提供了多种 `TemplateLoader` 实现,当需要从数据库传入模板内容时,通常可以使用自定义的 `TemplateLoader` 来实现这个功能。虽然没有直接从引用中找到关于从数据库传入模板内容使用哪种 `TemplateLoader` 的信息,但可以参考Freemarker的设计思路来分析。 一般来说,Freemarker内置的 `TemplateLoader` 有 `FileTemplateLoader`(从文件系统加载模板)、`ClassTemplateLoader`(从类路径加载模板)等,这些都不适合直接从数据库加载模板。因此,需要自定义一个 `TemplateLoader` 来从数据库中读取模板内容。 以下是一个简单的自定义 `TemplateLoader` 的示例代码: ```java import freemarker.cache.TemplateLoader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DatabaseTemplateLoader implements TemplateLoader { private Connection connection; public DatabaseTemplateLoader(String url, String user, String password) { try { this.connection = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } } @Override public Object findTemplateSource(String name) throws IOException { try { String sql = "SELECT template_content FROM templates WHERE template_name = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, name); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return resultSet.getString("template_content").getBytes(); } } catch (SQLException e) { e.printStackTrace(); } return null; } @Override public long getLastModified(Object templateSource) { return 0; } @Override public Reader getReader(Object templateSource, String encoding) throws IOException { return new InputStreamReader(new ByteArrayInputStream((byte[]) templateSource), encoding); } @Override public void closeTemplateSource(Object templateSource) throws IOException { // 这里可以添加关闭资源的逻辑 } } ``` 在这个示例中,`DatabaseTemplateLoader` 实现了 `TemplateLoader` 接口,并重写了相应的方法。`findTemplateSource` 方法从数据库中查询模板内容,`getReader` 方法将模板内容转换为 `Reader` 对象,以便Freemarker可以读取。 使用自定义的 `TemplateLoader` 时,可以这样配置Freemarker: ```java import freemarker.template.Configuration; import freemarker.template.TemplateExceptionHandler; public class Main { public static void main(String[] args) { Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); DatabaseTemplateLoader templateLoader = new DatabaseTemplateLoader("jdbc:mysql://localhost:3306/mydb", "user", "password"); cfg.setTemplateLoader(templateLoader); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值