java利用Freemarker模板生成格式友好的doc文檔(這種方式不支持docx)

近期做項目需要生成複雜的帶格式的word文檔,選擇過poi和itext來寫文檔,發現文檔生成沒問題,但是格式不好調,後來就想要利用freemarker模板來生成,效果還可以,今天就貼出來。
主要分爲以下幾步

  1. 整理一份排版友好的word文檔
    如:
    這裏寫圖片描述
    這裏寫圖片描述
  2. 修改word裏面需要填充的文字或圖片
    利用$符號把要填充的內容換成具體的變量佔位符
    不要直接在word文檔裏寫佔位符,可以在編輯器裏寫完成後再複製到word裏,這樣不會出現佔位符在文檔生成ftl模板後被分隔開的問題。
    這裏寫圖片描述
  3. 把修改後的word文檔另存爲xml
    這裏寫圖片描述
  4. 把生成的xml文件後綴名修改爲ftl
    這裏寫圖片描述
  5. 修改ftl模板裏的變量佔位符
    1、修改圖片的basecode64碼替換成具體的變量佔位符。
    這裏寫圖片描述
    說明:這裏要注意修改以下兩個屬性,如果不修改會導致圖片只顯示第一張圖片
<w:binData w:name="${"wordml://0300000"+warn_img_index+1+".png"}" xml:space="preserve">

<v:imagedata src="${"wordml://0300000"+warn_img_index+1+".png"}" o:title="svg_data_container_common_lkhs"/>

2、修改文字顯示的變量站位符號
普通的List<String>循環
這裏寫圖片描述
這裏寫圖片描述
List<Map>循環
這裏寫圖片描述
這裏寫圖片描述
6. 填充數據
這裏寫圖片描述
這裏寫圖片描述

        String file_path = "D:/export";
        String file_name = System.currentTimeMillis()+"_freemarker_word.doc";
        //加載freemarker模板
        FreemarkerWordUtils.createWord(data_map,"wordtemplates.ftl",file_path,file_name);
    /**
     * 把圖片轉換成basecode64碼
     * @param path
     * @return
     */
    public static  String getPic_base64code(String path){
        String img = null;
        InputStream in;
        byte[] picdata = null;
        try {
            in = new FileInputStream(path);
            picdata = new byte[in.available()];
            in.read(picdata);
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        img = encoder.encode(picdata);
        return img;
    }

最終生成的文檔如下:
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發佈了82 篇原創文章 · 獲贊 36 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章