近期做項目需要生成複雜的帶格式的word文檔,選擇過poi和itext來寫文檔,發現文檔生成沒問題,但是格式不好調,後來就想要利用freemarker模板來生成,效果還可以,今天就貼出來。
主要分爲以下幾步
- 整理一份排版友好的word文檔
如:
- 修改word裏面需要填充的文字或圖片
利用$符號把要填充的內容換成具體的變量佔位符
不要直接在word文檔裏寫佔位符,可以在編輯器裏寫完成後再複製到word裏,這樣不會出現佔位符在文檔生成ftl模板後被分隔開的問題。
- 把修改後的word文檔另存爲xml
- 把生成的xml文件後綴名修改爲ftl
- 修改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;
}
最終生成的文檔如下: