1. 程式人生 > >freemarker總結

freemarker總結

freemarker的作用

現在的任務是實現一個下載word文件的功能,而word文件是預先排版好的,我需要做的就是把從資料庫或者別的地方拿到的資料填充到對應的位置。使用freemarker實現出來的效果很好。

freemarker的使用

首先需要一個word文件,將來你需要下載的文件是什麼樣就寫成什麼樣,把需要填充的地方先寫上資料。把文件另存為2003xml格式,然後開啟xml檔案,找到剛才填充的資料,使用${name}替換掉剛才填充的資料(name需要自己命名,一會兒需要根據此命名填充資料)。freemarker的模板型別可以是xml或者是ftl,如果使用ftl型別,只需要把字尾名改成ftl就行了。我使用的是xml。 接下來是程式碼實現: 首先引入jar報:

<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.23</version>
</dependency>

然後在工具類裡面寫建立文件的方法:

 private static Configuration configuration = null;
    private static HashMap<String, Template> allTemplates = null;
    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            configuration.setDirectoryForTemplateLoading(new File("D:/"));//此處是xml文件所在的目錄,使用的是絕對路徑。也有另外兩種設定路徑的方法,不過我用的時候會找不到xml檔案。
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static File createDoc(Map<?, ?> dataMap, String type,String select) {
        String sel = null;
        if(select.equals("bzsq")){
            sel="bzsq.xml";
        }
        else if(select.equals("sqwt")){
            sel="sqwt.xml";
        }else if(select.equals("image")){
            sel="image.xml";
        }
        allTemplates = new HashMap<String, Template>();
        try {
            allTemplates.put("resume", configuration.getTemplate(sel));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        String name = "test" + (int) (Math.random() * 100000) + ".doc";
        File f = new File(name);
        Template t = allTemplates.get(type);
        try {
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

    public static File createDoc(Map<?, ?> dataMap, String type) {
            String sel = null;
            sel="test.xml";
        allTemplates = new HashMap<String, Template>();
        try {
            allTemplates.put("resume", configuration.getTemplate(sel));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        String name = "temp" + (int) (Math.random() * 100000) + ".doc";
        File f = new File(name);
        Template t = allTemplates.get(type);
        try {
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

或者建立excle

  public static File createXls(Map<?, ?> dataMap, String type) {

        allTemplates = new HashMap<String, Template>();
        try {
            allTemplates.put("resume", configuration.getTemplate("text.xml"));  //載入excel模板
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        String name = "temp" + (int) (Math.random() * 100000) + ".xls";
        File f = new File(name);
        Template t = allTemplates.get(type);
        try {
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

下載方法

public void bzsqDown(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name","gyl");
        map.put("postalcode", "231188");
        map.put("telephone","1889273893");
        
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 呼叫createDoc方法生成Word文件
            file=DownUtil.createDoc(map,"resume");
            fin = new FileInputStream(file);
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("application/msword");
            
            // 設定瀏覽器以下載的方式處理該檔案
           resp.addHeader("Content-Disposition","attachment;filename=test.doc");
            out = resp.getOutputStream();
            byte[] buffer = new byte[1024]; // 緩衝區
            int bytesToRead = -1;
            // 通過迴圈將讀入的Word檔案的內容輸出到瀏覽器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if (fin != null)
                fin.close();
            if (out != null)
                out.close();
            if (file != null)
                file.delete(); // 刪除臨時檔案
        }
    }

其流程簡要如下:

public void test1() throws Exception{
  //建立配置物件
  Configuration configuration = new Configuration(Configuration.getVersion()); 
  //設定模板檔案所在的路徑 
  configuration.setDirectoryForTemplateLoading(new File("D:/"));
  //設定字符集 
  configuration.setDefaultEncoding("UTF-8");
  //建立模板物件 
  Template template = configuration.getTemplate("test.xml"); 
  //建立資料集
  Map<String,Object> map = new HashMap<String,Object>();      
  map.put("type", "student");
  //建立Writer物件 
  File f = new File("temp.doc");
  Writer out = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
  //使用模板物件輸出檔案 
  template.process(dataModel, out); 
  //關閉流
  out.close();
 }