首頁  >  文章  >  Java  >  Java用freemarker導出word實用範例

Java用freemarker導出word實用範例

高洛峰
高洛峰原創
2017-01-05 13:18:211394瀏覽

最近一個專案要匯出word文檔,折騰老半天,發現還是用freemarker的模板來搞比較方便省事,現總結一下關鍵步驟,供大家參考,這裡是一個簡單的試卷生成例子。

一、模板的製作

先用Word做一個模板,如下圖:

Java用freemarker導出word實用範例

(注意,上面是有表格的,我設定了邊框不可見)然後另存為XML文件,之後用工具打開這個xml文件,有人用firstobject XML Editor感覺不如notepad++,我這裡用notepad++,主要是有高亮顯示,和元素自動配對,效果如下:

Java用freemarker導出word實用範例

上面黑色的地方基本上是我們之後要替換的地方,例如xytitle替換為${xytitle},對已表格要十分注意,例如選擇題下面的表格,我們可以透過查找來定位,一對代表一行,也就是一筆記錄(一道題),我們這裡要用一對#list>來將其包括,以便後續填充數據,具體可參考Freemarker頁面語法,例如這裡選擇題,我們是兩行為一筆記錄,所以要#list>要包含兩行,形如:題號題目 選項#list>,然後在這其中找對應的xzn,xztest,ans1,ans2,ans3,ans4替換為${plan1.xzn},${plan1.xztest},$ {plan1.ans1},${plan1.ans2},${plan1.ans3},${plan1.ans4},注意這裡的table1及plan1命名,table1後續填充資料要用到,其他的替換同理操作,得到效果如下:

Java用freemarker導出word實用範例

保存後,修改後綴名為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中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn