Java使用freemarker模板技术导出word

 步骤一:首先准备一个word,里面有你想要输出来的格式,比如复杂的表格或者很多其他的东西,我的word原始文件如下,现在想要从数据库里面获取姓名name填充到这个word当中:

       步骤二: 当准备好word格式文件,点击另存为,保存为word的xml格式,如下:

    

               使用一些ue或者其他文本工具打开,我用的是ue,会在关键节点上有颜色区分,这样能找到你需要替换的节点,一开始的格式很乱,你可以直接百度"xml 格式化",在线格式化一下你的xml文件:

  

       步骤三:当xml格式统一好后,找到你需要替换的"xxx",使用freemarker的特殊格式,使用"${}"来代替你即将从数据库获取的name,这样就能自动给你填充数据,如下:

          替换了之后,点击保存,然后修改后缀名为ftl,放到工程目录中.如下:

           步骤四:java代码中,填充name的数据,也就是${name},然后替换上自己的ftl模板文件,如下,点击运行代码,就可以在d盘生成word文件:

            最终效果如下:

              就两个java文件如下Main.java:

package com.havenliu.document;
 
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
 
public class Main {
 
    /**
     * @param args
     * @throws UnsupportedEncodingException
     */
    public static void main(String[] args) throws UnsupportedEncodingException {
        // DocumentHandler dh=new DocumentHandler();
        // dh.createDoc();
        // MyTest mt=new MyTest();
        // mt.createDoc();
 
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("name", "你好邱林和");
 
        MDoc mdoc = new MDoc();
        mdoc.createDoc(dataMap, "D:/outFile.doc");
        System.out.println("模板生成成功");
    }
 
}

       MDoc.java:
 

package com.havenliu.document;
 
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");
    }
 
    public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {
        // dataMap 要填入模本的数据文件
        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
        // 这里我们的模板是放在com.havenliu.document.template包下面
        configuration.setClassForTemplateLoading(this.getClass(), "/com/havenliu/document/template");
        Template t = null;
        try {
            // test.ftl为要装载的模板
            t = configuration.getTemplate("ceshifreemaker.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");
            // 这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
            // out = new BufferedWriter(new OutputStreamWriter(new
            // FileOutputStream(outFile)));
            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();
        }
    }
}
             自此大功告成,感谢这些前辈:http://blog.csdn.net/kkdelta/article/details/7220252,其他的我就不贴图了.  

             测试工程下载链接:https://download.csdn.net/download/omayyouhappy/10013796

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值