POI--导出多级表头通用方法

本文介绍了一种使用Java进行Excel表格导出的方法,特别关注了多级表头的处理与合并。文章详细解释了如何通过遍历表头数据,设置单元格样式,以及利用HashMap和CellRangeAddress实现列与行的合并,从而创建清晰且结构化的Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 已经通过四级表头测试

//导出表头
    public void exportHeadData(XSSFSheet sheet,String[][] propertyDes,XSSFCellStyle style){
         //表头部分

       // 二级表头测试数据
        /*String[][] propertyDes = {{"姓名","所属部门","职位","入职日期","转正日期","年假","","带薪病假","","调休剩余可休天数","本月加班天数","本月已休","","","","","",""},
                {"","","","","","基数","剩余可休天数","基数","剩余可休天数","","","年假","调休","带薪病假","婚假","产假","丧假","事假"}};*/

      //一级表头测试数据
        /*String[][] propertyDes = {{"姓名","所属部门","职位","入职日期","转正日期","年假","123","带薪病假","123","调休剩余可休天数","本月加班天数","本月已休","123","12","123","123","12","123"}};*/

    // 三级表头测试数据
        /*String[][] propertyDes = {{"1","","2","3","","",""},
                {"1","1","","3","","3",""},{"","","","3","3","3","3"}};*/

   // 四级表头测试数据
        /*String[][] propertyDes = {{"1","","2","3","","","","4","","","","","","",""},
                {"1","1","","3","","3","","4","","","","4","","",""},{"","","","3","3","3","3","4","","4","","4","","4",""},
                {"","","","","","","","4","4","4","4","4","4","4","4"}};*/


        int mergerNum = 0 ; //合并数
        //给单元格设置值
        for(int i=0; i< propertyDes.length; i++){
            XSSFRow row = sheet.createRow(i);
            row.setHeight((short)700);
            for(int j=0; j<propertyDes[i].length; j++){
                XSSFCell cell = row.createCell(j);
                cell.setCellStyle(style);
                cell.setCellValue(propertyDes[i][j]);
            }
        }
        Map<Integer,List<Integer>> map = new HashMap<Integer, List<Integer>>();   // 合并行时要跳过的行列
        //合并列
        for(int i=0; i<propertyDes[propertyDes.length-1].length; i++){
            if("".equals(propertyDes[propertyDes.length-1][i])){
                 for(int j=propertyDes.length-2; j >=0 ;j--){
                    if(!"".equals(propertyDes[j][i])){    
                        sheet.addMergedRegion(new CellRangeAddress(j,propertyDes.length-1,i,i)); // 合并单元格
                        break;
                    }else{
                        if(map.containsKey(j)){
                            List<Integer> list = map.get(j);
                            list.add(i);
                            map.put(j, list);
                        }else{
                            List<Integer> list = new ArrayList<Integer>();
                            list.add(i);
                            map.put(j, list);
                        }
                    }
                }
            }
        }
        //合并行
        for(int i=0; i< propertyDes.length-1; i++){
            for(int j=0; j<propertyDes[i].length; j++){
                List<Integer> list = map.get(i);
                if(list==null ||(list!=null&&!list.contains(j))){
                    if("".equals(propertyDes[i][j])){
                        mergerNum++ ;
                        if(mergerNum != 0 && j == (propertyDes[i].length-1)){
                            sheet.addMergedRegion(new CellRangeAddress(i,i,j-mergerNum,j)); // 合并单元格
                            mergerNum = 0 ;
                        }
                    }else {
                        if(mergerNum != 0){
                            sheet.addMergedRegion(new CellRangeAddress(i,i,j-mergerNum-1,j-1)); // 合并单元格
                            mergerNum = 0 ;
                        }
                    }
                }
            }
        }
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值