Freemaker基於word模板動態導出匯總整理


Freemaker基於word模板動態導出匯總整理

一、使用的jar包:

 

二、Word模板動態導出的基本思路:

1、首先通過自己在word中創建好需要導出的word文本+表格的模板,模板中需要填寫內容的地方填寫${},大括號內為后台傳遞進來的參數名,然后將該模板另存為xml格式;

2、xml格式文件進行適當的修改:

(1)修改${}所在的位置,讓${}在一個標簽內,因為替換值是根據${}進行識別的,因此必須讓${}在一個標簽內:

 

(2)如果有需要循環輸出的,需要添加<#list></>標簽,類似於增強for循環,無論是表格還是文字只要是需要循環輸出的,只要找好循環輸出數據的標簽,然后用<#list></>擴住,然后修改對應的循環輸出數據的${}參數名即可:

 

三、使用freemaker實現word模板動態導出基本步驟:

1、項目中引入freemaker引擎的jar包:

 

2、freemaker導出word的工具類放入項目中,並修改對應的wordxml模板所在的路徑和名稱:

 

3、編寫代碼,獲取word中需要的對應的數據,最終存儲到一個map中去(參數名必須要與word模板xml中對應的參數名保持一致):

 

 

4、編寫總方法,將map中的結果數據傳遞給工具類中的方法,實現word導出;

 

5、通過以上幾個步驟,變可以實現對word的動態導出。

四、需要注意的事項:

1、word模板xml中的${}一定要放在同一個標簽中;

2、如果有需要循環輸出的數據,在后台中每一條數據一定是放在一個對象中,不要放在一個map中,循環輸出的數據在后台是存儲在一個list對應集合中;

3、后台給word模板傳遞參數只能傳遞一個map參數,因此無論是單個參數還是list對象集合,最終都整合在一個map中進行存儲;

4、后台傳遞給word模板中的參數,不要為null,如果是不存在的值,那么就傳遞空字符串,也不要傳遞null進來。

五、word導出工具類代碼如下:

package com.jeecg.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

public class WordUtils { // 配置信息,代碼本身寫的還是很可讀的,就不過多注解了
    private static Configuration configuration = null;
    // 這里注意的是利用WordUtils的類加載器動態獲得模板文件的位置
    private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath()
            + "export/template/";
    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private WordUtils() {
        throw new AssertionError();
    }

    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String fileName)
            throws IOException {
        Template freemarkerTemplate = configuration.getTemplate("TMCatalogMainTemplateBatchDown.xml");
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 調用工具類的createDoc方法生成Word文檔
            file = createDoc(map, freemarkerTemplate);
            fin = new FileInputStream(file);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 設置瀏覽器以下載的方式處理該文件名
            fileName = fileName+".doc";
            response.setHeader("Content-Disposition",
                    "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

            out = response.getOutputStream();
            byte[] buffer = new byte[512]; // 緩沖區
            int bytesToRead = -1;
            // 通過循環將讀入的Word文件的內容輸出到瀏覽器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if (fin != null)
                fin.close();
            if (out != null)
                out.close();
            if (file != null)
                file.delete(); // 刪除臨時文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template) {
        String name = "test.doc";
        File f = new File(name);
        Template t = template;
        try {
            // 這個地方不能使用FileWriter因為需要指定編碼類型否則生成的Word文檔會因為有無法識別的編碼而無法打開
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}

 六、導出多個word的壓縮包,思路詳情和代碼見連接:

https://www.cnblogs.com/lsy-blogs/p/10173904.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM