使用freemarker匯出word
阿新 • • 發佈:2018-11-21
最近需要將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>
好了,至此基本就完成了。還有圖片的插入也很簡單,這裡就不多說了。