最近一個專案要匯出word文檔,折騰老半天,發現還是用freemarker的模板來搞比較方便省事,現總結一下關鍵步驟,供大家參考,這裡是一個簡單的試卷生成例子。
一、模板的製作
先用Word做一個模板,如下圖:
(注意,上面是有表格的,我設定了邊框不可見)然後另存為XML文件,之後用工具打開這個xml文件,有人用firstobject XML Editor感覺不如notepad++,我這裡用notepad++,主要是有高亮顯示,和元素自動配對,效果如下:
上面黑色的地方基本上是我們之後要替換的地方,例如xytitle替換為${xytitle},對已表格要十分注意,例如選擇題下面的表格,我們可以透過
保存後,修改後綴名為ftl,至此模板製作完畢。
二、程式實作
這裡用到了freemarker-2.3.13.jar包,程式碼如下:
package common; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class DocumentHandler { private Configuration configuration = null; public DocumentHandler() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException { //dataMap 要填入模本的数据文件 //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载, //这里我们的模板是放在template包下面 configuration.setClassForTemplateLoading(this.getClass(), "/template"); Template t=null; try { //test.ftl为要装载的模板 t = configuration.getTemplate("fctestpaper.ftl"); } catch (IOException e) { e.printStackTrace(); } //输出文档路径及名称 File outFile = new File(fileName); Writer out = null; FileOutputStream fos=null; try { fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8"); //这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。 //out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))); out = new BufferedWriter(oWriter); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { t.process(dataMap, out); out.close(); fos.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //System.out.println("---------------------------"); } }
中的key必須和模板中的對應,否則會報錯。效果如下: 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
更多Java用freemarker導出word實用範例相關文章請關注PHP中文網!