使用FreeMarker导出word文档

在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官网

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值