使用 jxl 根據下載資料模版匯出 excel 表——合併配置
阿新 • • 發佈:2018-11-04
使用jxl根據下載資料模版匯出excel表——合併配置:
首先根據模版檔案路徑讀取excel模版檔案,然後對excel檔案進行修改,即寫出資料到excel檔案中,再將該excel檔案儲存到目標檔案中,這裡操作excel必須是2003版本(.xls)
- 準備excel模版檔案
- 呼叫JxlUtil.java類的方法程式碼
/** * 匯出excel表 * */ public void download(HttpServletRequest request, HttpServletResponse response) { try { String wdir = request.getSession().getServletContext().getRealPath(""); String tempname = "test"; String dlFile = "/files/tmp/" + DateTimeUtil.getCurDateTime("yyyyMMdd") + "/" + tempname + System.nanoTime() + ".xls";// 臨時檔案目錄 String opTemp = wdir + "/files/temp/" + tempname + ".xls";// 匯出資料模板檔案的路徑 // 建立儲存寫出excel表的資料 Map<String, Object> map = new HashMap<String, Object>(); map.put("outPutDate", DateTimeUtil.getCurDateTime("yyyy-MM-dd")); // 從資料庫查詢的資料列表 List<Map<String, Object>> dataList = new ArrayList<Map<String,Object>>(); map.put("dataList", dataList); // 合併配置 Properties p = new Properties(); p.setProperty("mergeKey", "key1,key2");// 按哪幾列的資料進行合併 p.setProperty("mergeCol", "4");// 合併哪幾列 boolean wb = false; wb = JxlUtil.wrireExcel(map, wdir + dlFile, opTemp, p); if (!wb) { response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8;"); response.getWriter().print("<script>window.top.alert('下載檔案失敗,請稍後再試,謝謝。');</script>"); } else { String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort(); response.getWriter().print("<script>window.location.href='" + basePath + dlFile + "';</script>"); } } catch (IOException e) { e.printStackTrace(); } }
- JxlUtil.java類寫出excel(合併配置)方法程式碼
/** * 寫excel方法 * * @param dataMap 資料存放 * @param dlFile 下載資料模板檔案的地址 * @param opTempFile 匯出檔案的地址 * @param mergecfg 合併的配置(只支援縱向合併):mergeKey 指定按哪一列的資料進行合併; * mergeCol 指定合併哪幾列(格式1,2,3,4....) * @return */ public static boolean wrireExcel(Map<String, Object> dataMap, String dlFile, String opTempFile, Properties mergecfg) { Workbook workbook = null; WritableWorkbook wwb = null; WritableSheet ws = null; Label lcontent = null; WorkbookSettings seting = new WorkbookSettings(); int sheetIndex = 0; try { if (mergecfg == null) { mergecfg = new Properties(); } String tmpDir = dlFile.substring(0, dlFile.lastIndexOf("/")); File xdDlFile = new File(tmpDir); if (!xdDlFile.exists()) { xdDlFile.mkdirs(); } seting.setWriteAccess(null); workbook = Workbook.getWorkbook(new File(opTempFile));//根據模版檔案獲取工作薄 wwb = Workbook.createWorkbook(new File(dlFile), workbook, seting);//建立寫工作薄 ws = wwb.getSheet(sheetIndex);//建立寫工作表 ws.getSettings().setSelected(true); int rows = ws.getRows(); Map<String, Integer[]> tbidcountmap = new HashMap<String, Integer[]>(); for (int i = 0; i < rows; i++) { Cell[] keyCells = ws.getRow(i); if (keyCells != null) { for (int j = 0; j < keyCells.length; j++) { String cellContent = keyCells[j].getContents(); if (cellContent != null && !"".equals(cellContent)) { if (dataMap != null) { // 處理迴圈 if (cellContent.indexOf("${loop ") >= 0) boolean ischange = false; Cell[] cells = ws.getRow(i + 2); String elp = ""; if (cells != null) { elp = cells[j].getContents(); } if (elp != null && !"".equals(elp) && elp.indexOf("${end loop}") >= 0) { cellContent = cellContent.replaceAll("\\$\\{loop ", "") .replaceAll("\\}", ""); List<Map<String, Object>> list = (List<Map<String, Object>>) dataMap .get(cellContent); cells = ws.getRow(i + 1);//輸出的keys值 if (list != null) { for (int k = 0; k < list.size(); k++) { ws.insertRow(i + (k + 1)); // 處理合並配置 第1步 if (mergecfg.containsKey("mergeKey") && mergecfg.containsKey("mergeCol")) { String keys = mergecfg.get("mergeKey").toString(); String bkid = (String) list.get(k).get(keys.split(",")[0]); String tuserid = (String) list.get(k).get(keys.split(",")[1]); if (bkid != null && !"".equals(bkid)) { if (tbidcountmap.containsKey(bkid + "," + tuserid)) { Integer[] rc = tbidcountmap.get(bkid + "," + tuserid); rc[1] = rc[1] + 1; tbidcountmap.put(bkid + "," + tuserid, rc); } else { Integer[] rc = { i + k, 1 }; // 哪一行開始到哪一行結束 tbidcountmap.put(bkid + "," + tuserid, rc); } } keys = null; bkid = null; tuserid = null; } for (int l = 0; l < cells.length; l++) { Iterator<String> kit = list.get(k).keySet().iterator(); elp = cells[l].getContents(); boolean iskey = false; if (elp != null && !"".equals(elp)) { while (kit.hasNext()) { String key = kit.next(); if (elp.indexOf("${" + key + "}") >= 0) { iskey = true; elp = list.get(k).get(key) + ""; } key = null; } if (!iskey) { elp = ""; } lcontent = new Label(l, (i + (k + 1)), elp); lcontent.setCellFormat(cells[l] .getCellFormat()); ws.addCell(lcontent); } kit = null; } } ws.removeRow(i); ws.removeRow(i + list.size()); ws.removeRow(i + list.size()); i = i + list.size() - 2;// 從列表的後一行開始 rows = rows + list.size() - 3;// 行數也增加 ischange = true; } list = null; } if (!ischange) { ws.removeRow(i); ws.removeRow(i); ws.removeRow(i); rows = rows - 3; } cells = null; } else { // 處理非迴圈列表 Iterator<String> it = dataMap.keySet().iterator(); while (it.hasNext()) { String key = it.next(); if (cellContent.indexOf("${" + key + "}") >= 0) { cellContent = cellContent.replaceAll("\\$\\{" + key + "\\}", dataMap.get(key) + ""); } key = null; } lcontent = new Label(j, i, cellContent); lcontent.setCellFormat(keyCells[j].getCellFormat()); ws.addCell(lcontent); it = null; } } } cellContent = null; } } keyCells = null; } // 處理合並配置 第2步 if (mergecfg.containsKey("mergeKey") && mergecfg.containsKey("mergeCol")) { String mergeCol = mergecfg.getProperty("mergeCol"); String[] mcs = mergeCol.split(","); Iterator<Integer[]> mitList = tbidcountmap.values().iterator(); while (mitList.hasNext()) { Integer[] rc = mitList.next(); if (rc[1] > 1) { for (int i = 0; i < mcs.length; i++) { Integer m = Integer.parseInt(mcs[i]); ws.mergeCells(m, rc[0], m, rc[0] + rc[1] - 1); } } rc = null; } mergeCol = null; mcs = null; } return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { try { wwb.write(); wwb.close(); } catch (Exception e) { e.printStackTrace(); } if (workbook != null) { workbook.close(); } } }