利用freemaker和ftl檔案匯出word帶不開的問題
阿新 • • 發佈:2019-01-25
背景
自己寫的小專案中需要一個word匯出功能,經過網上的查詢,發現利用freemaker和ftl檔案的方法比較簡單。
流程
先用word建立一個模板,將裡面需要替換的內容使用${xxx}來代替,然後另存為.xml檔案(儲存為2003-xml),然後直接將字尾名替換為ftl即可,最後用editplus後者nodepad++檢查一下替換的內容是否正確,有可能會出現將\$淡出處理的情況,如有錯誤改正即可。
程式碼:
public class WordTest {
private Configuration configuration = null;
public WordTest(){
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
public static void main(String[] args) {
WordTest test = new WordTest();
test.createWord();
}
public void createWord(){
Map<String,Object> dataMap=new HashMap<String,Object>();
getData(dataMap);
configuration.setClassForTemplateLoading(this.getClass(), "");//模板檔案所在路徑
Template t=null;
try {
t = configuration.getTemplate("test.ftl"); //獲取模板檔案
} catch (IOException e) {
e.printStackTrace();
}
File outFile = new File("E:/11/"+Math.random()*10000+".doc"); //匯出檔案
Writer out = null;
try {
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
// out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out); //將填充資料填入模板檔案並輸出到目標檔案
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void getData(Map<String, Object> dataMap) {
dataMap.put("title", "標題");
dataMap.put("nian", "2016");
dataMap.put("yue", "3");
dataMap.put("ri", "6");
dataMap.put("shenheren", "lc");
// List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
// for (int i = 0; i < 10; i++) {
// Map<String,Object> map = new HashMap<String,Object>();
// map.put("xuehao", i);
// map.put("neirong", "內容"+i);
// list.add(map);
// }
//
//
// dataMap.put("list", list);
}
}
問題
生成的word打不開,總是報檔案包含錯誤,xml錯誤之類的。苦惱了很久之後,發現是編碼的問題。
一開始的程式碼寫的是
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
這裡缺少對流的編碼,導致出現word打不開。
正確的修改為:
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
out = new BufferedWriter(oWriter);
問題解決。