使用freemarker按模板匯出帶表格word文件
阿新 • • 發佈:2019-02-14
一.製作模板
1.將word文件製作成以下樣式,需要替換的內容放佔位符,並按照佔位符名字替換資料。表格裡,使用RR.XXX的形式的佔位符。RR表示當前行物件的名字,XXX相當於物件的屬性名。寫後臺的時候,根據這些名將資料存為map,即名字為鍵值。
例子如下:
2.將word另存為xml格式,這裡因為專案需要,我將word儲存為.xml 2003。然後將xml檔案以標籤的形式開啟,這裡我使用的是文字編輯工具 Notepad。使用Notepad開啟時,需要注意使用外掛將文字重新format一下,便於修改。這裡我使用的是XML Tools中的Pretty print(XML only - with line breaks),外掛網上有,直接下就行。用Notepad開啟時的樣子如下
3.
下一步就是在表格資料行的位置加入list標籤,使得表格資料可以迴圈插入,可以把這個標籤看做一次對list的遍歷。在這之前,需要看看有沒有佔位符出現空格的標籤,保證佔位符 例如 ${XM} 這個整體是在一起的。
確定之後,在首個數據行標籤的前面加 list 標籤。如圖,標籤格式 #list +這個list的名字(根據後臺存的鍵值)+as +每行資料物件的名字 ,這裡圖方便兩個名字我起的一樣的。
加好之後,在這個資料行w:tr 標籤結尾處,關閉list標籤,這樣模板就做完了。
二.後臺方法
Action
public void exportSBCL() throws Exception{ try { Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = qualityManagementService.getDbInfoById(dbid); Configuration configuration = new Configuration(); configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); //載入需要裝填的模板 configuration.setClassForTemplateLoading(this.getClass(),"/com/njzaizao/web/secondRevision/qualityManagement"); //設定物件包裝器 configuration.setObjectWrapper(new DefaultObjectWrapper()); //設定異常處理器 configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定義Template物件 Template template = configuration.getTemplate("gjxmTmp.ftl"); //輸出文件 String fileName = "計劃申請書.doc"; try { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO-8859-1")); response.setCharacterEncoding("utf-8");//這句很重要,不加word裡都是亂碼 template.process(dataMap, response.getWriter()); }catch (Exception e) { e.printStackTrace(); } finally { response.flushBuffer(); } } catch (Exception e) { e.printStackTrace(); } }
Service
這裡serveice主要是業務程式碼,重點是Map裡的鍵值,與模板中的對應上就行。public Map<String,Object> getDbInfoById(String dbid){ Map<String,Object> dataMap = new HashMap<String, Object>(); ShortSlab slab = qualityManagementDao.getShortSlabById(dbid); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); dataMap.put("XZMC", slab.getXZMC()); dataMap.put("CLSJ", sdf.format(slab.getCLSJ())); dataMap.put("KTMC", slab.getKTMC()); dataMap.put("KTLX", slab.getKTLX()!=null?commonCodeKtlx.get(slab.getKTLX()):""); dataMap.put("SJZY", slab.getSJZY()!=null?commonCodeSjzy.get(slab.getSJZY()):""); dataMap.put("HDZDZ", slab.getHdzdz().getXM()); dataMap.put("ZDSZGBH",slab.getZDSZGZS()==null?"":slab.getZDSZGZS().getZSBH()); dataMap.put("LXR", slab.getLXR()); dataMap.put("LXFS", slab.getLXFS()); dataMap.put("DWMC", slab.getOrgInfo().getDEPT_NAME()); String sqlMem = qualityManagementDao.getMemebersSql(dbid); String[] params = new String[] { dbid}; List<Object[]> memList = HibernetUtil.querySQL(sqlMem,params ); List<Map<String ,Object>> members = new ArrayList<>(); for(Object[] objArr:memList){ Map<String ,Object> memMap = new HashMap<>(); memMap.put("PX", objArr[0]); memMap.put("ZNFG", Util.isNumberic(String.valueOf(objArr[1]))?commonCodeZnfg.get(String.valueOf(objArr[1])):objArr[1]); memMap.put("YG_ID", objArr[2]); memMap.put("NL", objArr[3]); memMap.put("XM", objArr[4]); memMap.put("XB",objArr[5]!=null?commonCodeXb.get(String.valueOf(objArr[5])):""); String ZYJNXXDJ = objArr[6]!=null?commonCodeZyjsdj.get(String.valueOf(objArr[6])):""; String ZGZYJSZGDJ = objArr[7]!=null?commonCodeZyjndj.get(String.valueOf(objArr[7])):""; memMap.put("XL",""); members.add(memMap); } dataMap.put("XZCY", members); return dataMap; }