Excel中对一个身份多个角色进行名称的单元格合并。

本文介绍了一种针对Excel导出教师名单时的优化方法,特别是对于拥有多个角色的教师信息,通过合并相同姓名来提高数据展示的清晰度。文章详细解释了如何使用Java代码实现这一功能,包括身份鉴别、行数计算以及单元格合并。

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

1.前言

  最近,对Excel的导出进行了优化,也可以说是修复之前的不足。这个Excel导出的具体任务是导出一个教师的名单。每一个教师都可能存在多个身份,之前对于多个角色的教师信息的展示:

可以很明显的看出导出数据的缺陷,这样的展示会让人误以为这是四个教师,所以为了方便用户观看识别,有必要对一个人多角色的姓名进行一个合并的展示:具体的效果如下:

2.正文

  实现的效果其实就是Excel中的合并居中,代码中实现这个的难点就在:

  1.身份的鉴别,什么情况下确认这些角色都是同一个人

     2.一个教师多个角色数据的行数,也就是合并的起使行数和结束行数

  3.单角色的教师是不用合并的,但是会影响到计算多角色的合并

  因为我拿出的JSONArray的数据都是几个表的关联查询,一个用户的多个角色信息都是连在一起的,所以相对好判断,代码:

    /**
     *  一个身份多个角色,对名称的合并
     * @param pja 入参
     * @param index 判断身份的数据
     * @return
     */
    public com.alibaba.fastjson.JSONArray getSameData( com.alibaba.fastjson.JSONArray pja , String index ) {
        logger.debug("开始剖析合并数据");
        Set<String> set = new HashSet<>();
        //对数据进行遍历
        for ( int i = 0; i < pja.size() - 1; i ++ ) {
            JSONObject jo = pja.getJSONObject( i );
            //拿出判断是否是同一个人的判断数据,通常是唯一信息(如:手机号等)
            String sameI = jo.getString( index );
            //计数器,角色的数量,默认是有一个角色的
            int count = 1;
            //如果该数据已经和其他的数据进行相同判断了,下面该身份其他角色就不用再进行判断了
            if( set.add( sameI ) ) {
                //如果之前还没有这个唯一的信息,则加入set
                set.add( sameI );
                //对剩下的数据进行遍历,和之前的进行比较判断
                for (int j = i + 1; j < pja.size(); j++) {
                    JSONObject joo = pja.getJSONObject( j );
                    String sameJ = joo.getString(index);
                    //进行判断
                    if ( !set.add(sameJ) ) {
                        //如果重复则表明该角色的用户已经存在,角色数量+1
                        count++;
                    } else {
                        //如果出现新的数据,则将最后出现比较的数据移除set
                        set.remove( sameJ );
                        //放入起使的行数
                        jo.put("startRow", i);
                        jo.put("endRow", j - 1);
                        jo.put("num", count);
                        //退出
                        break;
                    }
                }
            }
        }
        return pja;
    }

对数据进行处理后,在重画Excel表格的时候,塞数据时候进行单元格合并就行:

                if ( joo.containsKey( "startRow" ) ){
                    sheet.addMergedRegion( new CellRangeAddress( joo.getInteger("startRow") + 2, joo.getInteger("endRow") + 2, 0 , 0 ) );
                }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值