1. 程式人生 > >使用freemarker匯出word

使用freemarker匯出word

      最近需要將jsp部分頁面匯出為word檔案,環境是Spring+SpringMVC+Hibernate。

   我使用的是FreeMarker模板引擎來完成。這是FreeMarker的中文參考手冊,感興趣的看一下。http://freemarker.foofun.cn/

   好啦,接下來正式動手之前我們需要把相應的jar包下載好並匯入,下面是最新的連結。

   https://freemarker.apache.org/freemarkerdownload.html

   我們要做的事情其實很簡單,準備一個word模板,編寫Controller檔案,編寫DocUtil工具類 以及提供匯出的test.jsp。

   1.我們先新建一個需要匯出的word文件,在插入資料的地方用${資料}的形式替代,例如這樣

   


     我們建立好了需要後另儲存為xml格式。

     

     開啟test.xml大約是這樣,

   

    注意:有時候因為排版的問題,可能${資料}會被拆開,我們調整一下就好。

    之後另存為ftl檔案,我們的模板檔案就完成了,再放在我們的專案目錄下就好了,這裡我在專案根目錄下建立了freemarker.template資料夾來存放模板。

   

    2.現在可以開始編寫DocUtil工具類了,我就直接直接貼程式碼了。

      

package com.rsp.core.util;
import java.io.*;

import freemarker.template.Template;

import freemarker.template.Configuration;

import java.util.HashMap;
import java.util.Map;

public class DocUtil {
    
private static Configuration configuration = null; private static Map<String, Template> allTemplates = null; static { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassForTemplateLoading(DocUtil.class, "/freemarker/template"); allTemplates = new HashMap<>(); try { allTemplates.put("test", configuration.getTemplate("test.ftl")); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } private DocUtil() { throw new AssertionError(); } public static File createDoc(Map<?, ?> dataMap, String type) { String name = "temp" + (int) (Math.random() * 100000) + ".doc"; File f = new File(name); Template t = allTemplates.get(type); try { // 這個地方不能使用FileWriter因為需要指定編碼型別否則生成的Word文件會因為有無法識別的編碼而無法開啟 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; } }

 

   3.Controller類方法

@RequestMapping(value="/exportWord")
@ResponseBody
    public void exportword(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
      
        req.setCharacterEncoding("utf-8");
        Map<String,Object> map=new HashMap<String,Object>();

        Enumeration<String>  paramNames=req.getParameterNames();
        //通過迴圈將表單元素放入鍵值對
        while(paramNames.hasMoreElements()){
            String key=paramNames.nextElement();
            String value=req.getParameter(key);
            map.put(key,value);
        }
        DocUtil doc=new DocUtil();
        File file=null;
        InputStream fin=null;
        ServletOutputStream out=null;
        try {
            file=DocUtil.createDoc(map,"test");
            fin = new FileInputStream(file);
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("application/msword");
            // 設定瀏覽器以下載的方式處理該檔案預設名為test.doc
            resp.addHeader("Content-Disposition", "attachment;filename=test.doc");

            out = resp.getOutputStream();
            byte[] buffer = new byte[512];    // 緩衝區
            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();
        }


    }

 

 

 

 

    4.test.jsp,注意這裡的name屬性要與word裡的資料名一樣,不然會報錯。

<form name="mainform" action="${pageContext.request.contextPath}/news/exportWord" method="post"> 

<div id="main-box">

<div class="title"> 個人資訊 </div> <div class="body">

<p>姓名:<input name="name"type="text" style="width: 301px;"></p>

<p>性別<input name="sex" type="text" style="width: 301px;"></p>

<p>年齡:<input name="age" type="text" style="width: 301px;"></p>
 <input type="submit" value="匯出">

</div>

</form>

 好了,至此基本就完成了。還有圖片的插入也很簡單,這裡就不多說了。