java+springmvc實現根據freemarker模板導出word模板。模板使用的後綴能夠是:.xml,也能夠是.ftl。html
步驟1,引入freemarker的jar包。java
步驟2,製做模板文件。(紅框中的內容是爲了替換使用)spring
另存爲xml格式,mvc
找到xml文件,右鍵用editplus打開,找到紅框的標記1,標記2進行修改。app
若是是表格的話,表頭的第一行須要保留。dom
表格的主體部分須要保留一個,測試
這裏eList是從後臺賦值的一個集合,${e_index+1}是根據<#list eList as e>這個別名+_index獲得,用法基本與el表達式用法相同。this
這樣一個模板就完成了,將模板複製進項目中便可,後綴是什麼不重要,重要的是咱們用freemarker解析。編碼
步驟4,java後臺代碼。spa
@RequestMapping("/test/toWord") public ModelAndView toWord(HttpServletRequest request, HttpServletResponse response) throws IOException{ File file = createDoc(); response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("UTF-8"); java.io.BufferedInputStream bis = null; java.io.BufferedOutputStream bos = null; try { long fileLength = file.length(); response.setContentType("application/msword"); response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("測試的,統計-導出時間"+DateTimeUtils.getDateTime("yyyyMMddHHmmss")+".doc", "utf-8")); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(file)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } return null; } private File createDoc(){ // 建立數據 Map<String,Object> dataMap = new HashMap<String, Object>(); dataMap.put("cwlx", "測試的"); List<?> eList = new ArrayList<?>();// 這裏是獲取list列表的方法 dataMap.put("czsj",DateTimeUtils.getDateTime("yyyyMMddHHmmss"));// 這裏是獲取當前時間的一種方式,能夠根據本身程序自行修改 dataMap.put("eList", eList); // 獲取模板 Configuration configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassForTemplateLoading(this.getClass(), "/tpl"); Template t = null; String name = "temp"+(int)(Math.random()*1000)+".doc"; File file = new File(name); try { t = configuration.getTemplate("model.xml"); t.setEncoding("UTF-8"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(name),"UTF-8")); t.process(dataMap, out); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return file; }
在前臺頁面是須要作的就是發送一個連接就能夠了。
特別注意,
常常忽視的問題,編碼的問題,這裏須要統一編碼。
若是出現了word文件不能打開的狀況,建議看一下後臺文件是否報錯。若是後臺沒有報錯的話,建議用editplus打開word的文檔,查看文檔中是否有亂碼的狀況。
筆者第一次使用的時候,常常出現word文件不能打開的問題,因而我在editplus中打開,發現部分漢字是亂碼的,加了上圖紅框中的默認編碼的設置以後就能夠了。
以上代碼是本人親測過的,能夠放心使用。若有不明白的地方,歡迎交流。若有不正確的地方或累贅的地方也能夠互相交流。