1. 程式人生 > >使用 jxl 根據下載資料模版匯出 excel 表——合併配置

使用 jxl 根據下載資料模版匯出 excel 表——合併配置

使用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();
        }
    }
}