freemarker生成word文档(亲测)

1.maven依赖:

        <dependency>

           <groupId>org.freemarker</groupId>
           <artifactId>freemarker</artifactId>
           <version>2.3.22</version>

        </dependency>

2.Word模板


    Word模板打开,另存为*.xml,然后将文件原封不动的粘贴到resources包下的docXml文件夹中(注意:不可打开xml文件,直接粘贴进去即可)



3.代码

(1)xml文件的位置


(2)导出Word的工具类Util

package com.lanjingjr.console.datuminfo.controller;


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

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class ExportWordUtilDemo {

    //读取配置文件
    private static Configuration configuration = null;
    private static Map<String,Template> allTemplate = null;
    private static final String TEMPLATE_PATH = "/docXml"; // 模板加载路径
    private static final String DEFAULT_ENCODING = "UTF-8"; // 模板解析编码

    static{
        configuration = new Configuration(Configuration.VERSION_2_3_22);
        //设置编码
        configuration.setDefaultEncoding(DEFAULT_ENCODING);
        //按照路径加载模板
        configuration.setClassForTemplateLoading(ExportWordUtilDemo.class, TEMPLATE_PATH);
        //存储模板
        allTemplate = new HashMap<String,Template>();
        try{
            //按照指定编码读取文档
            allTemplate.put("paymentNoticeTemplate", configuration.getTemplate("noticeTemplet.xml",DEFAULT_ENCODING));
        }catch(IOException e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    private ExportWordUtilDemo(){
    }

    /**  * 创建doc文档  * @param dataMap  * @param type  * @return  */  public static File createDoc(Map<?,?> dataMap,String type){
        //文件名
        String name = "temp" + (int)(Math.random()*100000) + ".doc";
        File file = new File(name);
        //获取模板
        Template t = allTemplate.get(type);
        try{
            //这个地方不能使用FileWriter因为需要指定编码类型否则声场的word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(file),DEFAULT_ENCODING);
            t.process(dataMap,w);
            w.flush();
            w.close();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return file;
    }
}

其中特别注意,UTF-8必须要写,尤其是读取Template模板的时候,否则声称的word文档会显示xml,而不是你要的结果

(3)Controller方法调用,生成Word文档

@RequestMapping("exportPaymentNotice.do")
public void exportPaymentNotice(HttpSession session) throws IOException, TemplateException {
    User user = this.getCurrentUser(User.class, session);
    // 要填入模本的数据文件
    Map dataMap = new HashMap();
    dataMap.put("userName", "你好");
    dataMap.put("borType", "你好");
    dataMap.put("borAmount", "50000");
    dataMap.put("platformFee", "50000");
    dataMap.put("loanInterest", "50000");
    dataMap.put("borTime", "50000");
    dataMap.put("dealTime", "50000");
    dataMap.put("repaymentType", "50000");
    dataMap.put("totalCost", "50000");

    //提示:在调用工具类生成Word文档之前应当检查所有字段是否完整
    //否则Freemarker的模板殷勤在处理时可能会因为找不到值而报错,这里暂时忽略这个步骤
    File file = null;
    InputStream fin = null;
    ServletOutputStream out = null;

    try{
        //调用工具类WordGenerator的createDoc方法生成Word文档
        file = ExportWordUtil.createDoc(dataMap, "paymentNoticeTemplate");
        fin = new FileInputStream(file);

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/msword");
        response.addHeader("Content-Disposition", "attachment;filename=resume111.doc");

        out = response.getOutputStream();
        byte[] buffer = new byte[1024];//缓冲区
        int bytesToRead = -1;
        // 通过循环将读入的Word文件的内容输出到浏览器中
        while((bytesToRead = fin.read(buffer)) != -1) {
            out.write(buffer, 0, bytesToRead);
        }
        out.flush();
    }catch(Exception ex){
        ex.printStackTrace();
    }
    finally{
        if(fin != null) fin.close();
        if(out != null) out.close();
        if(file != null) file.delete(); // 删除临时文件
}
}