ant design动态合并行单元格

本文介绍了一种使用React的Table组件展示复杂报表数据的方法,通过自定义rowSpan属性实现表格单元格的纵向合并,提高了数据展示的清晰度和效率。

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

 

    const detailColumn = [
      {
        title: '报表名',
        dataIndex: 'aa',
        className: 'center',
        width: '20%',
        render: (text, record) => {
          const obj = {
            children: text,
            props: {},
          };
          obj.props.rowSpan = record.rowSpan;
          return obj;
        },
      },
      {
        title: '指标名称',
        dataIndex: 'bb',
        className: 'center',
        width: '20%',
      },...
.....

          <Table
            rowKey="indexCode"
            dataSource={makeData(reportInfoDataDetail)} //关注 makeData
            columns={columns}
            bordered
            pagination={false}
            scroll={{ y: 300 }}
            rowClassName={() => 'editable-row'}
            components={components}
          />
.....



//遍历子元素,并赋值纵向合并数rowSpan
function makeData(data) {
  const sortResult = sortData(data);
  const dataSource = [];
  sortResult.forEach((item) => {
    if (item.children) {
      item.children.forEach((itemOne, indexOne) => {
        const myObj = itemOne;
        myObj.rowSpan = indexOne === 0 ? item.span : 0;
        dataSource.push(myObj);
      });
    }
  });
  return dataSource;
}

//去重并合并到children
function sortData(dataArr) {
  const orgArrRe = dataArr.map(item => ({ reportName: item.reportName }));
  const orgArr = uniqueObjArr(orgArrRe, 'reportName');//数组去重
  for (const childOne of orgArr) { //去重reportName合并到children,得到一共有几个不同的reportName要合并
    childOne.children = [];
    for (const childTwo of dataArr) {
      if (childOne.reportName === childTwo.reportName) { //childOne是去重的,childTwo是没去重的
        childOne.children.push(childTwo);
      }
    }
  }
  for (const every of orgArr) {
    every.span = every.children ? every.children.length : 0;
  }
  orgArr.forEach((every) => { every.span = every.children ? every.children.length : 0; });
  return orgArr;
}

//对象数组去重
function uniqueObjArr(arr, fieldName) {
  const result = [];
  const resultArr = [];
  for (const child of arr) {
    if (result.indexOf(child[fieldName]) === -1) {
      result.push(child[fieldName]);
      resultArr.push(child);
    }
  }
  return resultArr;
}

效果图:

 

### 右上角,点个赞呗!谢谢

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值