1. 程式人生 > >利用freemaker和ftl檔案匯出word帶不開的問題

利用freemaker和ftl檔案匯出word帶不開的問題

背景

自己寫的小專案中需要一個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);

問題解決。