使用FreeMarker导出word文档

来源:互联网 发布:怎么看数据库地址 编辑:程序博客网 时间:2024/06/16 01:08

在Java web项目中使用FreeMarker导出word文档

在最近的项目中,有需求需要导出word文档。经过一番研究,笔者发现导出word文档的方法的确是有很多种,比如使用Jacob、Apache POI、Java2Word、iText等等,但是都没有使用freemarker来的简单直接预方便。因此,下面笔者演示一下利用freemarker生成简单word文档的例子。当然,复杂的word文档的生成也是同样的原理与方法。

FreeMarker

首先,我们看一段FreeMarker官方的介绍:Apache FreeMarker是一个模板引擎:基于模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等)的Java库。 模板是使用FreeMarker模板语言(FTL)编写的,这是一种简单的专业语言(不是像PHP这样的全面的编程语言)。 您的意图是准备数据以真正的编程语言显示,例如问题数据库查询和进行业务计算,然后模板显示已准备好的数据。 在模板中,您将重点关注如何呈现数据,而在模板外,您将关注要显示的数据。
也就是说,使用FreeMarker模板,我们可以生成各种文本,包括word文档。

下面我们就使用FreeMarker生成word文档。

  1. 制作ftl模板
    因为freemarker是基于模板,所以,首先我们需要制作ftl即freemarker模板。
    制作步骤:如下图所示:
    (1).新建word模板
    这里写图片描述
    假如,我们就要生成这样的一个word文档,注意${}中,即是我们将要填充的动态数据。
    (2).将上面的word文档另存为xml格式
    这里写图片描述
    使用编辑工具打开查看,比如使用notepad++打开:
    这里写图片描述
    如上图显示。
    (3).修改此xml文件的格式为ftl,即生成我们最终的模板
    这里写图片描述
    至此,模板制作完成。
  2. 新建Dynamic web project项目WordDemo
  3. 引入freemarker的jar,下载地址
    http://freemarker.org/freemarkerdownload.html
  4. 将上面的ftl模板引入项目,同时建立如下的目录结构:
    这里写图片描述
  5. 编写MDoc类:
package cn.com.mp.utils;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class MDoc {    private Configuration configuration = null;    public MDoc() {        configuration = new Configuration();        configuration.setDefaultEncoding("utf-8");    }    /**     *      * @param dataMap  要填充的数据集合     * @param fileName 生成的word文档路劲与名称     * @throws UnsupportedEncodingException     */    public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException {        //读取模板        configuration.setClassForTemplateLoading(this.getClass(), "/cn/com/mp/utils");        Template t=null;        try {            t = configuration.getTemplate("template.ftl");        } catch (IOException e) {            e.printStackTrace();        }        File outFile = new File(fileName);        Writer out = null;        FileOutputStream fos=null;        try {            fos = new FileOutputStream(outFile);            //注意对流的编码            OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");            out = new BufferedWriter(oWriter);         } catch (FileNotFoundException e1) {            e1.printStackTrace();        }        try {            t.process(dataMap, out);            out.close();            fos.close();        } catch (TemplateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

6 . 编写测试类

package test;import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.Map;import cn.com.mp.utils.MDoc;public class Main {    public static void main(String[] args)  {        Map<String, Object> dataMap = new HashMap<String, Object>();        dataMap.put("title", "如何使用freemarker生成word文档");        dataMap.put("context", "首先建立ftl模板,引入freemarker的jar包,编写MDoc类读取模板,编写Main测试类,使用map集合填充模板");        dataMap.put("author", "mp");        dataMap.put("date", "2017-05-18");        MDoc mdoc = new MDoc();        try {            mdoc.createDoc(dataMap, "E:/outFile.doc");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }    }}

7 . 测试结果:
这里写图片描述
在e盘,确实存在outFile文件,打开查看:
这里写图片描述
生成我们预期的word文档。

8 . 总结
至此,我们使用freemarker完成了word文档的导出。如果你使用过其他的技术导出过word文档,那么此刻,使用freemarker的好处就不言而喻,很直接很方便。

更多FreeMarker的知识,查看Freemarker官网

编写的过程难免会出现各种错误,欢迎大家指教。

原创粉丝点击