欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用FreeMarker导出word文档

程序员文章站 2022-06-06 10:33:07
...

在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模板
    使用FreeMarker导出word文档
    假如,我们就要生成这样的一个word文档,注意${}中,即是我们将要填充的动态数据。
    (2).将上面的word文档另存为xml格式
    使用FreeMarker导出word文档
    使用编辑工具打开查看,比如使用notepad++打开:
    使用FreeMarker导出word文档
    如上图显示。
    (3).修改此xml文件的格式为ftl,即生成我们最终的模板
    使用FreeMarker导出word文档
    至此,模板制作完成。
  2. 新建Dynamic web project项目WordDemo
  3. 引入freemarker的jar,下载地址
    http://freemarker.org/freemarkerdownload.html
  4. 将上面的ftl模板引入项目,同时建立如下的目录结构:
    使用FreeMarker导出word文档
  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 . 测试结果:
使用FreeMarker导出word文档
在e盘,确实存在outFile文件,打开查看:
使用FreeMarker导出word文档
生成我们预期的word文档。

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

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

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