項目有時候須要將一些內容導出成word格式,實現方式不少種,如:POI導出,freemarker導出。freemarker導出比較簡單。 html
主要分三步: java
新建一個word文檔,把格式和內容定好。以下圖:導出內容和導出人兩部分,到時候會根據運行時內容替換。 工具
爲了方便修改模板,建議寫一些文字,不然修改模板的時候,不知道在哪改。 測試
最好不要直接寫freemarker標記。word有可能會將${marker}這幾個字符分開存儲。 this
將填好的模板,保存成xml格式。 url
用xml編輯工具,記事本便可。將裏面導出內容和導出人這兩個動態內容換成freemarker模板語言。 spa
改爲: code
注意編輯工具的字符集必定要和XML字符集一致,不然會形成亂碼。 xml
1 public class WordHandler { 2 private Configuration configuration = null; 3 Log logger = LogFactory.getLog(WordHandler.class); 4 5 public WordHandler() { 6 configuration = new Configuration(); 7 configuration.setDefaultEncoding("UTF-8"); 8 } 9 10 private Template getTemplate(String templatePath, String templateName) throws IOException { 11 configuration.setClassForTemplateLoading(this.getClass(), templatePath); 12 Template t = null; 13 t = configuration.getTemplate(templateName); 14 t.setEncoding("UTF-8"); 15 return t; 16 } 17 18 19 public void write(String templatePath, String templateName, Map dataMap, Writer out) throws WordHandlerException { 20 try { 21 Template t = getTemplate(templatePath, templateName); 22 t.process(dataMap, out); 23 } catch (IOException e) { 24 logger.error(e); 25 throw new WordHandlerException(e); 26 } catch (TemplateException e) { 27 logger.error(e); 28 throw new WordHandlerException(e); 29 } finally { 30 try { 31 out.close(); 32 } catch (IOException e) { 33 logger.error(e); 34 throw new WordHandlerException(e); 35 } 36 } 37 } 38 }
測試代碼: htm
1 Map map = new HashMap(); 2 map.put("content","這是基於freemarker導出成word格式。包含圖片"); 3 map.put("userName","二土"); 4 WordHandler handler = new WordHandler(); 5 Writer out = new OutputStreamWriter(new FileOutputStream("D:\\uploadFiles\\測試.doc"), "UTF-8"); 6 handler.write("/test/com/sinoprof/tiger/doc", "test.xml", map, out); 7
爲了保證生成的正確性,輸出流必定要設字符集。
上表的測試代碼是生成本地文件。若是是基於servlet的導出,以下表:
1 ServletOutputStream out = res.getOutputStream(); 2 Writer writer = new OutputStreamWriter(out, "UTF-8"); 3 //其餘內容相同
測試結果: