freemarker 导出word

来源:互联网 发布:网站数据修改 编辑:程序博客网 时间:2024/06/11 18:35
freemarker 导出word 步骤:

1.    导入freemarker-2.3.19.jar 包
2.    将模板另存为  .xml文件
 

 

3.    打开xml文件找到需要填充数据的字段添加 ${变量名称}

    xml 中的内容<w:t>姓名:${name}</w:t></w:r>


如:
要在 姓名  后面添加数据 姓名:${name}

 

4.    修改完后,将文件后缀改为 .flt格式

5.    添加导出代码


import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class ExportWord
{
    private Configuration configuration = null;

    private Template template = null;

    private static Object obj = new Object();

    public ExportWord()
    {

    }

    @SuppressWarnings("unchecked")
    public void init(Map map, OutputStream outs, String inUrl)
    {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");

        // 设置test.flt所在的加载路径,在test包下
        configuration.setClassForTemplateLoading(this.getClass(), "/com/util");

        try
        {
            // test.flt为要装载的模板
            template = configuration.getTemplate(inUrl);
            template.setEncoding("utf-8");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        createDoc(map, outs);
    }

   

    /**
     * 创建Doc文件
     *
     * @author
     */
    @SuppressWarnings("unchecked")
    public void createDoc(Map map, OutputStream outs)
    {
        // 填充模板数据
        // getData(dataMap);
        Writer out = null;
        // File outFile = new File("d:/aa.doc");
        try
        {
            out = new BufferedWriter(new OutputStreamWriter(outs, "utf-8"));
            // out = new BufferedWriter(new OutputStreamWriter(new
            // FileOutputStream(outFile), "utf-8"));
        }
        catch (Exception e1)
        {
            e1.printStackTrace();
        }

        try
        {
            // 这里注意同步,因为前面是单例
            synchronized (obj)
            {
                template.process(map, out);
            }
            outs.flush();
            outs.close();
            out.close();
        }
        catch (TemplateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }

    /**
     * 填充数据 注意dataMap里存放的数据Key值要与模板中的参数相对应
     *
     * @param dataMap
     * @author
     */
    private void getData(Map dataMap)
    {
        dataMap.put("zhengshu_number", "00000111");
        dataMap.put("aa", "张三");
        dataMap.put("bb", "1000.52");
    }

}


6.    给模板中添加需要填充的数据,使用Map封装
// 导出模板的数据
        Map dataMap = new HashMap<String, String>();
        // 姓名
     dataMap.put("name","XXXXXXXXXXXX" );

注意:map中的key 为第3步中标红的 ${变量名称} ,“变量名称“必须和模板中添加的名称一致,否则数据填充不上去
如:
    dataMap.put("name","XXXXXXXXXXXX" );

7.    调用封装word的类、
// 输出流
       OutputStream outs = response.getOutputStream();

String fileName = "aa" + String.valueOf(System.currentTimeMillis()).substring(9, 13) + ".doc";
        String headStr = "attachment; filename="" + fileName + """;
        response.setContentType("APPLICATION/OCTET-STREAM");
        response.setHeader("Content-Disposition", headStr);
// 调用的模板名称
     String modelName = "aa.flt";
     ExportWord word = new ExportWord();
        word.init(dataMap, outs, modelName);



原创粉丝点击