Java Web項目中使用Freemarker生成Word文檔


Web項目中生成Word文檔的操作屢見不鮮。基於Java的解決方式也是非常多的,包含使用JacobApache POI、Java2Word、iText等各種方式,事實上在從Office 2003開始。就能夠將Office文檔轉換成XML文件,這樣僅僅要將須要填入的內容放上${}占位符,就能夠使用像Freemarker這種模板引擎將出現占位符的地方替換成真實數據,這種方式較之其它的方案要更為簡單。


以下舉一個簡單的樣例。比方在Web頁面中填寫個人簡歷,然后點擊保存下載到本地。效果圖例如以下所看到的。


打開下載的Word文件


首先在Eclipse Java EE版中新建一個Dynamic Web Project,項目結構例如以下圖所看到的


須要向項目中增加freemarker的JAR文件,能夠通過以下的鏈接獲得Freemarker的最新版本號:

http://freemarker.org/freemarkerdownload.html


模板文件resume.ftl是怎樣生成的呢。事實上很easy,將須要的Word文檔做好之后。選擇另存為XML文件。另存之后建議用Editplus、Notepad++、Sublime等工具打開查看一下,由於有的時候你寫的占位符可能會被拆開,這樣Freemarker就無法處理了。


打開XML文件看看吧。假設剛才你寫的${title}、${name}被xml文件給拆散了,改動一下XML文件就OK了。


改動過后另存為resume.ftl模板文件,例如以下所看到的:


接下來就是Servlet(也能夠是Struts2的Action、Spring MVC的Controller等)和工具類WordGenerator的編寫以及頁面test.jsp的制作了,代碼例如以下所看到的:

小服務的代碼:

[java]  view plain  copy
  1. package com.lovo.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.util.Enumeration;  
  8. import java.util.HashMap;  
  9. import java.util.Map;  
  10.   
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletOutputStream;  
  13. import javax.servlet.annotation.WebServlet;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.   
  18. import com.lovo.util.WordGenerator;  
  19.   
  20. /** 
  21.  * Servlet implementation class MyServlet 
  22.  */  
  23. @WebServlet("/saveDocServlet")  
  24. public class MyServlet extends HttpServlet {  
  25.     private static final long serialVersionUID = 1L;  
  26.   
  27.     @Override  
  28.     protected void service(HttpServletRequest req, HttpServletResponse resp)  
  29.             throws ServletException, IOException {  
  30.         req.setCharacterEncoding("utf-8");  
  31.         Map<String, Object> map = new HashMap<String, Object>();  
  32.         Enumeration<String> paramNames = req.getParameterNames();  
  33.         // 通過循環將表單參數放入鍵值對映射中  
  34.         while(paramNames.hasMoreElements()) {  
  35.             String key = paramNames.nextElement();  
  36.             String value = req.getParameter(key);  
  37.             map.put(key, value);  
  38.         }  
  39.       
  40.         // 提示:在調用工具類生成Word文檔之前應當檢查全部字段是否完整  
  41.         // 否則Freemarker的模板殷勤在處理時可能會由於找不到值而報錯 這里臨時忽略這個步驟了  
  42.         File file = null;  
  43.         InputStream fin = null;  
  44.         ServletOutputStream out = null;  
  45.         try {  
  46.             // 調用工具類WordGenerator的createDoc方法生成Word文檔  
  47.             file = WordGenerator.createDoc(map, "resume");  
  48.             fin = new FileInputStream(file);  
  49.               
  50.             resp.setCharacterEncoding("utf-8");  
  51.             resp.setContentType("application/msword");  
  52.             // 設置瀏覽器下面載的方式處理該文件默認名為resume.doc  
  53.             resp.addHeader("Content-Disposition""attachment;filename=resume.doc");  
  54.               
  55.             out = resp.getOutput
posted @ 2017-08-17 13:27  wzjhoutai  閱讀( 3037)  評論( 0編輯  收藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM