前言:表哥之前已經過一篇freemarker模板導出帶表格word詳細教程 https://blog.csdn.net/erpenggg/article/details/81204061,爲什麼現在又要寫一篇呢。
因爲我這次的項目是在手機端導出下載並且查看,用上面的方法導出後,在電腦端和蘋果手機端查看是正常的,但是在安卓端,打開卻是模版源碼,經過測試,發現是word存模版的時候格式問題,上述鏈接的導出我另存的是xml格式,在安卓手機端不兼容,所以這篇是用的word xml格式。既然格式改了,那模版裏面有的數據綁定的方式就需要改變(下文會舉例說明)。
一。整體環境:
開發環境:java,idea
二。功能需求:(數據需要導出成以下格式)
1.簡單格式:
2.複雜一點 表格格式:
3.複雜一點 圖片格式(圖片數量不確定,需要循環):
三。準備工作:
先準備好Freemarker模版:步驟如下:
1.簡單的文本,我們需要做的就是把需要導出到word的數據 使用${}替換下(這就相當於佔位符)如圖;
把需要導出的內容用佔位符替換下。
2.表格的:
3.圖片的:
在需要插入圖片的地方放入一張圖片佔位。
四。修改模版
上面改好之後把word另存爲word xml,我這次不用xml,前面說到的在手機上不兼容,然後通過在線的xml格式化通過notepad++打開,修改好格式:
1.普通文本:
2.表格的話需要在<w:tbl>標籤內<w:tr>加上list標籤,用來接收後面後端的數據:
list結束標籤。
因爲序號並不是寫死的,直接用<w:t>${zjl_index+1}</w:t>替換,(因爲默認爲0,所以加1)
最後把後綴改成.ftl就好了,過程:.word>.word xml>.ftl。
3.圖片的,也是本章重點講的:
(1).如果另存爲xml格式的話,比較簡單,圖開始那張展位的圖片在xml裏面是很長一串base64的代碼,替換掉,用${XXX}替換,添加list標籤,並且用index區分圖片集合的數據。
(2).也就是本文中的另存爲word xml格式的模版,圖片的話會比較複雜;需要修改三個地方
1.一般都是模版頂部
2.佔位的地方
3.模版底部,
<pkg:binaryData>標籤代碼其實代表的是圖片的實際內容,傳入的是圖片的base64碼,後面代碼有圖片轉碼的過程。
五。開始後端編碼
人狠話不多,直接貼編碼:上個教程有....這裏加了一段代碼
加載模版方法:https://blog.csdn.net/erpenggg/article/details/81216386
圖片List添加轉碼的圖片
public static String imageToBase64(String path) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(path);
} catch (FileNotFoundException e) {
log.error("加載圖片未找到", e);
e.printStackTrace();
}
try {
data = new byte[in.available()];
//注:FileInputStream.available()方法可以從輸入流中阻斷由下一個方法調用這個輸入流中讀取的剩餘字節數
in.read(data);
in.close();
} catch (IOException e) {
log.error("IO操作圖片錯誤", e);
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
不同與上次的是在瀏覽器導出,這次需要的是導出到手機,所以我是把導出的word存放在服務器上,然後返回存放地址。
大功告成,這玩意有點要人命。
六:案例demo程序下載
https://download.csdn.net/download/erpenggg/12524329
導出結果:
七:題外話
每做一次 踩坑一次。 如果遇到問題 請加QQ 602841248
1.另存模版的時候xml ,word xml, word 2003 Xml 每個數據綁定的模式都不一樣。
2.循環圖片的時候記得rid不要重複,不然循環的是同一張圖片。
3.指定圖片的寬高: 參考 https://blog.csdn.net/justry_deng/article/details/84144023