Spring Boot + FreeMarker製做word模板導出Word表格

freemarker

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

 

<!--添加freeMarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>


下一步咱們要作的是先好咱們的word模板而後將模板轉換爲xml文件。在word模板中須要定義好咱們的佔位符哦,使用${string}的方式。「string」根據本身的愛好定義就行了。java

過程以下:程序員

word文檔:數據庫

 

而後將咱們的word文檔另存爲xml文檔。編程

 

將咱們的xml文檔的後綴改成ftl,而後用能夠打開ftl文件的軟件打開咱們的ftl文件。在這裏咱們有幾個須要注意的地方。編程語言

第一,定義的佔位符可能會被分開了。就像下面這樣:工具

咱們須要作的就是刪掉多餘的部分,圖中我定義的是${userName}.因此我就把多餘的刪掉,變成${userName}就能夠了。編碼

第二,咱們須要注意的就是在咱們的表格部分須要本身添加freeMarker標籤。在表格代碼間用自定的標籤括起來。定義的參數要和咱們在方法中定義的一致,不然沒法取到值。spa

表格開始:
code

 

 結束:</list>orm

 

package czc.sup.system.model.six;



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

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

public class WordUtil {

    /**
     * 生成word文件
     * @param dataMap word中須要展現的動態數據,用map集合來保存
     * @param templateName word模板名稱,例如:test.ftl
     * @param filePath 文件生成的目標路徑,例如:D:/wordFile/
     * @param fileName 生成的文件名稱,例如:test.doc
     */
    @SuppressWarnings("unchecked")
    public static void createWord(Map dataMap,String templateName,String filePath,String fileName){
        try {
            //建立配置實例
            Configuration configuration = new Configuration();

            //設置編碼
            configuration.setDefaultEncoding("UTF-8");

            //ftl模板文件
            configuration.setClassForTemplateLoading(WordUtil.class,"/");

            //獲取模板
            Template template = configuration.getTemplate(templateName);

            //輸出文件
            File outFile = new File(filePath+File.separator+fileName);

            //若是輸出目標文件夾不存在,則建立
            if (!outFile.getParentFile().exists()){
                outFile.getParentFile().mkdirs();
            }

            //將模板和數據模型合併生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));


            //生成文件
            template.process(dataMap, out);

            //關閉流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

    
    public static void main(String[] args) {
         /** 用於組裝word頁面須要的數據 */
        Map<String, Object> dataMap = new HashMap<String, Object>();
        DataWord dataWord = new DataWord("model", "name", "designCode", "code", "met", "date", "temp", "humi", "hly");
        List<Object> datas = new ArrayList<>();
        for(int i=0;i<10;i++){
            Data data = new Data("1","檢測名"+i, "norm", "result", "remark");
            datas.add(data);
        }
        dataMap.put("product",dataWord);
        dataMap.put("datas",datas);
        String filePath = "";
        if (IsWhatSystem.whatSystem()) {
            //文件路徑
            filePath = "D:/doc_f/";
        }else {
            filePath = "/doc_f/";
        }
        //文件惟一名稱
        String fileOnlyName = "生成Word文檔.doc";
        /** 生成word  數據包裝,模板名,文件生成路徑,生成的文件名*/
        WordUtil.createWord(dataMap, "quality.ftl", filePath, fileOnlyName);
    }
    

而後就在相應的目錄下導出word文檔了

相關文章
相關標籤/搜索