Web項目中生成Word文檔的操作屢見不鮮。基於Java的解決方式也是非常多的,包含使用Jacob、Apache 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的制作了,代碼例如以下所看到的:
小服務的代碼:
- package com.lovo.servlet;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Enumeration;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.lovo.util.WordGenerator;
- /**
- * Servlet implementation class MyServlet
- */
- @WebServlet("/saveDocServlet")
- public class MyServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- @Override
- protected void service(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);
- }
- // 提示:在調用工具類生成Word文檔之前應當檢查全部字段是否完整
- // 否則Freemarker的模板殷勤在處理時可能會由於找不到值而報錯 這里臨時忽略這個步驟了
- File file = null;
- InputStream fin = null;
- ServletOutputStream out = null;
- try {
- // 調用工具類WordGenerator的createDoc方法生成Word文檔
- file = WordGenerator.createDoc(map, "resume");
- fin = new FileInputStream(file);
- resp.setCharacterEncoding("utf-8");
- resp.setContentType("application/msword");
- // 設置瀏覽器下面載的方式處理該文件默認名為resume.doc
- resp.addHeader("Content-Disposition", "attachment;filename=resume.doc");
- out = resp.getOutput