el-table之表格单元格合并

一.多级表头

el-table多级表头实现比较容易,直接在el-table中嵌套使用el-table-column即可。
话不多说,直接上代码:

<el-table
   class="table-cls"
   :data="tableData"
   :span-method="cellMerge"
   style="width: 100%"
 >
 <el-table-column
      type="index"
      label="序号"
      width="60"
    />
    <el-table-column
      prop="city"
      label="地市州"
    />
    <el-table-column label="基础项得分">
      <el-table-column
        prop="shujuduijie"
        label="数据对接(60分)"
      >
        <el-table-column
          prop="shujufugaiqingkuang"
          label="数据覆盖情况(34)"
        />
        <el-table-column
          prop="shujuzhiliangqingkuang"
          label="数据质量情况(15)"
        />
        <el-table-column
          prop="jishixing"
          label="及时性(11)"
        />
      </el-table-column>
      <el-table-column
        prop="xitongyingyong_title"
        label="系统应用(24分)"
      >
        <el-table-column
          prop="xitongyingyong"
          label="系统应用(16)"
        />
        <el-table-column
          prop="yonghukaitong"
          label="用户开通(4)"
        />
        <el-table-column
          prop="xitongfangwen"
          label="系统访问(4)"
        />
      </el-table-column>
    </el-table-column>
    <el-table-column
      prop="jichuxiangyingdefen"
      label="基础项应得分"
    />
    <el-table-column label="加分项得分">
      <el-table-column
        prop="jiafen_shixiangshuli"
        label="事项梳理"
      />
      <el-table-column
        prop="jiafen_shujuduijie"
        label="数据对接"
      />
    </el-table-column>
    <el-table-column
      prop="zongdefen"
      label="总得分"
    />
  </el-table>

效果如图所示:

二.表格单元格合并

HTML代码:
<el-table
   id="table-export"
   class="table-cls"
   height="82%"
   :data="tableData"
   tooltip-effect="light"
   :span-method="cellMerge"
   :cell-style="cellStyle"
   :header-cell-style="{background:'#f5f7fa'}"
   border
   style="width: 100%"
 >
   <el-table-column
     prop="indexFlag"
     label="序号"
     align="center"
     width="60"
   />
   <el-table-column
     prop="yijizhibiao"
     label="一级指标"
     align="center"
   />
   <el-table-column
     prop="erjizhibiao"
     label="二级指标"
     align="center"
   />
   <el-table-column
     prop="name"
     label="三级指标(分值)"
   />
 </el-table>
数据准备:
tableData= [
  {
    yijizhibiao: '事项梳理',
    erjizhibiao: '地方监管事项梳理',
    name: '监管事项清单(4)'
  },
  {
    yijizhibiao: '事项梳理',
    erjizhibiao: '地方监管事项梳理',
    name: '检查实施清单(12)'
  },
  {
    yijizhibiao: '数据对接',
    erjizhibiao: '数据覆盖情况',
    name: '监管行为数据(22)'
  },
  {
    yijizhibiao: '数据对接',
    erjizhibiao: '数据覆盖情况',
    name: '双随机、一公开(6)'
  },
  {
    yijizhibiao: '数据对接',
    erjizhibiao: '数据覆盖情况',
    name: '监管对象(3)'
  },
  {
    yijizhibiao: '数据对接',
    erjizhibiao: '数据覆盖情况',
    name: '执法人员(3)'
  },
  {
    yijizhibiao: '数据对接',
    erjizhibiao: '及时性',
    name: '监管行为数据更新情况(10)'
  }
]

data中初始化每一列需要合并的数组和对应下标:

 data() {
   return {
     tableData: [],

     indexFlag: [],
     yijizhibiao: [],
     erjizhibiao: [],
     name: [],

     idx_index: 0,
     idx_yijizhibiao: 0,
     idx_erjizhibiao: 0,
     idx_name: 0
   }
 }

tableData数据从后台返回后,需要先对数据先进行处理,以便让组件知道某一列合并的具体行数。前面data中定义的数组就是存放具体合并的行数的。
这里因为没有序号,所以先对序号进行处理,添加到tableData中的每个对象中去。

getSpanArr() {
   let i = 1
   // 返回的数据没有序号,需要单独处理序号
   this.tableData.forEach((ele, idx) => {
     if (idx == 0) {
       ele.indexFlag = 1
     } else {
       if (this.tableData[idx].yijizhibiao != this.tableData[idx - 1].yijizhibiao) {
         ele.indexFlag = ++i
       } else {
         ele.indexFlag = i
       }
     }
   })
   this.rowspan(this.indexFlag, this.idx_index, 'indexFlag')
   this.rowspan(this.yijizhibiao, this.idx_yijizhibiao, 'yijizhibiao')
   this.rowspan(this.erjizhibiao, this.idx_erjizhibiao, 'erjizhibiao')
   this.rowspan(this.name, this.idx_name, 'name')
 }

rowspan方法就是具体处理某一列行合并数的方法:

 rowspan(spanArr, position, spanName) {
   this.tableData.forEach((item, index) => {
     if (index === 0) {
       spanArr.push(1)
       position = 0
     } else {
       if (this.tableData[index][spanName] === this.tableData[index - 1][spanName]) {
         spanArr[position] += 1
         spanArr.push(0)
       } else {
         spanArr.push(1)
         position = index
       }
     }
	console.log(spanArr, position)
   })
 }

在得到每列需要合并的数据后,在el-table标签:span-method="cellMerge"执行cellMerge合并单元格。
cellMerge有四个参数,分别是当前行数据,当前列数据,当前行号和列号。

 // 表格合并行
 cellMerge({ row, column, rowIndex, columnIndex }) {
   if (column.label === '序号') {
     return this.rowMerge('indexFlag', rowIndex)
   } else if (column.label === '一级指标') {
     return this.rowMerge('yijizhibiao', rowIndex)
   } else if (column.label === '二级指标') {
     return this.rowMerge('erjizhibiao', rowIndex)
   } else if (column.label === '三级指标(分值)') {
     return this.rowMerge('name', rowIndex)
   }
 },
 rowMerge(item, rowIndex) {
   const _row = this[item][rowIndex]
   const _col = _row > 0 ? 1 : 0
   return {
     rowspan: _row,
     colspan: _col
   }
 },

posted @   小韓烟柳  阅读(1561)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示