1. 程式人生 > >使用FreeMarker生成Word文檔

使用FreeMarker生成Word文檔

2.3 auth 相關 htm buffered exceptio HA 需要 template

FreeMarker簡介:
FreeMarker是一款模板引擎:即一種基於模板和要改變的數據,並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具,它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
FreeMarker是免費的,基於Apache許可證2.0版本發布。其模板編寫為FreeMarker Template Language(FTL),數據簡單、專用的語言。需要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算,之後模板顯示已經準備好的數據。在模板中,主要用於如何展示數據,而在模板之外註意於要展示什麽數據。

1、實例是maven工程,工程對jar包的依賴,pom.xml中主要的依賴是對freemarker的包依賴

<!-- freemarker依賴 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
    </dependencies>

2、maven工程的目錄,其中com.freemarker.template包中存放的模板文件,例如本實例中的resume.ftl文件

  技術分享圖片

3、我們所需要的模板.ftl文件是從哪裏來的呢?(本例中的resume.ftl)其中很簡單,FreeMarker是模板引擎,所以我們首先要一個模板,生成word文檔當然也不例外,我們先新建一個word文件,然後把需要的改變的字段賦一個標識位,如Flag1、Flag2,方便後面替換

  技術分享圖片

  把該word文檔另存為XML文件:

  技術分享圖片

  

  另存後建議用用Editplus、Notepad++、Sublime等工具打開查看一下(樓主用的Editplus)。復制文件內容,在線格式化化一下,然後覆蓋原文件內容

  找到之前的標識位,然後替換成${name}、${age}等

  技術分享圖片

4、好了,前期的準備工作都完成了,現在開始功能的實現了

 工具類代碼:

package com.freemarker.util;

import com.freemarker.bean.Resume;
import freemarker.template.Configuration;

public class FreemarkerConfig {

    private static Configuration configuration = null;

    static {
        configuration = new Configuration(Configuration.VERSION_2_3_0);
        configuration.setDefaultEncoding("UTF-8");

        configuration.setClassForTemplateLoading(Resume.class, "/com/freemarker/template");
        // configuration.setTemplateLoader(new FileTemplateLoader(new
        // File("F:/temp/")));
    }

    public static Configuration getConfiguation() {
        return configuration;
    }

}

package com.freemarker.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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

/**
 * 生成doc文件工具類
 * 
 * @author xuwenjin
 */
public class OutputDoc {

    /**
     * 生成doc文件
     * 
     * @param tempName
     *            模板文件名
     * @param docName
     *            生成的doc文件名
     * @param variables
     *            變量
     * @return
     */
    public static void makeDoc(String tempName, String docName, Map<String, Object> variables) {
        String output = "uploadFiles" + File.separator + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
                + File.separator;
        File f = new File(output);
        if (!f.exists()) {
            f.mkdirs();
        }
        output = (output + docName + ".doc").replaceAll("\\\\", "/");
        try {
            Configuration cfg = FreemarkerConfig.getConfiguation();
            Template temp = cfg.getTemplate(tempName + ".ftl");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(output)), "UTF-8"));
            temp.process(variables, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("name", "張三");
        variables.put("sex", "");
        variables.put("age", "28");
        variables.put("phone", "1234567");
        variables.put("mail", "[email protected]");
        variables.put("education", "本科");
        makeDoc("resume", "xuwenjin", variables);
    }

}

5、執行OutputDoc中的main方法,刷新下工程,會發現工程多了個文件夾uploadFiles

  技術分享圖片

  雙擊xuwenjin.doc,查看生成的word文件,如下圖:

  技術分享圖片

  本文源碼的地址:https://github.com/xuwenjin/xwj_repo/tree/master/com.freemarker  

  相關參考資料:

    SpringMVC中使用FreeMarker生成Word文檔

    Freemarker中Configuration的setClassForTemplateLoading方法參數問題

使用FreeMarker生成Word文檔