通過freemarker,以及JAVA,導出word文檔。
共分為三步:
第一步:創建模板文件
第二步:通過JAVA創建返回值。
第三步:執行
分別介紹如下:
第一步:
首先創建word文檔,按照想要的格式寫好模板,需要替換的位置,使用 ${} 占位,其{}中放入名稱,以便執行代碼時使用。
例子如下
這個模板只要是報告的格式,包括報告名稱,報告時間,報告人。下邊的是編號和標題,以及內容。因為標題和內容方面可能存在多個,在后邊可以循環輸出。
制作完成之后,將該文檔另存為xml格式。(注意:盡量選擇2003版本的xml,否則可能出現文檔太大打不開的問題。)
另存為xml之后,需要對其做簡單的修改以便於循環輸出。
我使用的結果為Map嵌套的,所以輸出的循環語句為
<#assign num= 0>
<#list kejis?keys as key> //kejis為接收map的鍵。
<#assign num = num+1>
${num}${kejis[key].title} //在這需要找到文檔中中對應位置做相應修改。
</#list>
也可以使用list集合輸出。
修改完成之后將文件后綴修改為ftl格式。備用
第二步:
1.首先准備工具類,導出用,類中的方法共四個參數,按順序為 傳遞的值(Map類型),模板文件,生成word存儲路徑,生成文件名
package Util; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; import java.util.Locale; import java.util.Map; public class WordUtil { public static void createWord(Map dataMap, String templateName, String filePath, String fileName){ try { //創建配置實例 Configuration configuration = new Configuration(); //設置編碼 configuration.setDefaultEncoding("UTF-8"); configuration.setEncoding(Locale.getDefault(), "utf-8"); //ftl模板文件統一放至 com.lun.template 包下面 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(); } } }
2.准備返回值及調用
public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("time", "2019-4-1"); map.put("name", "報告名稱"); map.put("bgname", "wys"); Map<String, Object> kejis=new HashMap<String, Object>(); for(int i=0;i<10;i++) { Wordout wordout=new Wordout(); wordout.setTitle("標題"+i); wordout.setContent("內容"+i); kejis.put(""+i, wordout); //注意此處的第一個參數應保持每次put都是不同的 } map.put("kejis", kejis); String filePath = "D:\\policy\\" ; String filename = "bk.doc"; WordUtil.createWord(map, "bk.ftl", filePath, filename); }
第三步:執行上邊代用主函數的代碼生成word成功,結果如下
以上便完成了word文檔導出。
總結:
經過多次嘗試,導出的word文檔大小和xml文件的大小成正比的,所以在xml文件加循環的時候,應該盡量減少循環中的內容,以減小文件的大小,否則,生成的文件會太大導致打開太慢,或者無法打開的問題。
並且另存為xml文件的時候,選擇2003版本為宜,因為經過測試,相同的word模板,另存為兩種不同xml大小不同,2003版本的較小,所以選擇該版本。
假如想入輸出帶有格式的word,只需要將占位符修改為相應格式即可。字體格式,大小,顏色等屬性都會繼承過去。
附:
這是經常用到的freemarker的語法
1.if語句(判斷是否為空)
<#if target?? >
此處為if為true的內容
</#if>
2.list循環(map循環上文使用過了)
<#list list as t>
${t.title}
</#list>
如果想實現多層嵌套,只需要將返回值也嵌套進去,xml文件也相應的嵌套即可。
這是我首次使用freemarker的過程,如有錯誤,望指正,我及時修改