java導出excel時合並同一列中相同內容的行


一、有時候導出Excel時需要按類別導出,一大類下好幾個小類,小類下又有好幾個小小類,就像下圖:

要實現這個也不難,

思路如下:按照大類來循環,如上就是按照張江校區、徐匯校區、臨港校區三個大類循環,然后再處理小類,因為本例小小類不涉及合並,所以只涉及處理小類,如果需要處理小小類,還需要在處理一下,具體實現原理同小類;

      每次循環時記錄下此次循環的房屋類型和上次循環的房屋類型,兩者相同時,要合並的結束行++,否者,說明這個房屋類型已經循環完畢(前提是各類型都按順序order by 了,保證相同類型相鄰),開始融合。具體實現如下:

二、實現代碼,具體思路已經在注釋中了

    public void expStatistics(String filePath,String campuscode) {
        try {
            WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath));
            JxlFormatUtil Jfu = new JxlFormatUtil();
            WritableSheet ws = wwb.createSheet("房屋報表統計", 0);
            
            String[] tableHead = {"校區名稱:20","房屋類型:30","房屋用途:30","使用面積(㎡):20"};
            for (int i = 0; i < tableHead.length; i++) {//每一列的標題樣式
                ws.addCell(new Label(i, 0, tableHead[i].split(":")[0], JxlFormatUtil.wcHead));
                ws.setColumnView(i, Integer.valueOf(tableHead[i].split(":")[1]));
            }
            int col = 1;//從第1行開始
            
            //以下變量用來融合相同內容 的行
            int perCol = col;
            String perPurpose = "";//上一個用途類型
            String purpose = "";//當前用途類型
            int startMergeCol = 1;//要融合的第一行
            int endMergeCol = 0;//要融合的最后行
            boolean flag = true;//用來記錄是否是第一次循環
            
            //根據搜索條件導出
            List<FcxtCampus> campusList = new ArrayList<FcxtCampus>();
            if(null != campuscode && !"".equals(campuscode)){
                campusList = campusdao.findCampusByCode(campuscode);
            }else {
                campusList =campusdao.findCampus();
            }
            
            for (FcxtCampus campus : campusList) {
                List<FcxtBuild> builds = builddao.statisticsBuilds(campus.getCampuscode());//獲取所有房屋信息
                if(null != builds && builds.size() > 0){
                    for (FcxtBuild build : builds) {
                        int row = 0;//從第0列開始
                        ws.addCell(new Label(row++, col, campus.getCampusname(), JxlFormatUtil.wcCenter));
                        purpose = build.getUsefulpurpose();
                        if(flag){//如果是第一次循環,將perPurpose初始化,以便后面的第一次判斷
                            perPurpose = purpose;
                            flag = false;
                        }
                        ws.addCell(new Label(row++, col, FcxtBuild.BUILD_USEFULPURPOSE.get(build.getUsefulpurpose()), JxlFormatUtil.wcCenter));
                        if(purpose.equals(perPurpose)){
                            endMergeCol++;
                        }else{//兩者不相同時,融合之前相同的行
                            ws.mergeCells(1, startMergeCol, 1, endMergeCol);
                            startMergeCol = col;
                            endMergeCol = startMergeCol;
                            perPurpose = purpose;
                        }
                        ws.addCell(new Label(row++, col, FcxtBuild.BUILD_BUILDINGTYPE.get(build.getBuildingtype()), JxlFormatUtil.wcCenter));
                        ws.addCell(new Label(row++, col, build.getBuildarea().toString(), JxlFormatUtil.wcCenter));
                        col++;
                    }
                    ws.mergeCells(0, perCol, 0, col-1);
                    perCol = col;
                }
            }
            
            wwb.write();
            wwb.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM