element UI 中 el-table合并单元格

481 阅读2分钟

el-table合并单元格

运行结果:

image.png

template标签:

<el-table
  :data="tableData"
  :span-method="objectSpanMethod"
  border
  height="70%"
  style="width: 100%">
  <el-table-column
    v-for="(item,index) in labelData"
    :key="index"
    :prop="item.name"
    :label="item.label"
    :resizable="false"
    width="150"
  >
  </el-table-column>
</el-table>

script标签:

//data部分
data(){
    return {
        //表头数据
        labelData: [
            {
              name: 'devName',
              label: '设备名称'
            },
            {
              name: 'targetName',
              label: '监测点名称'
            },
            {
              name: '00:05',
              label: '00:05'
            },
            {
              name: '00:10',
              label: '00:10'
            },
            {
              name: '00:15',
              label: '00:15'
            },
        ], 
        
         //表格数据
        tableData: [
            {
                devName:"1",
                targetName: "P",
                '00:05': "23.00",
                '00:15': "23.03",
                '00:10': "23.02",
              },
              {
                devName:"1",
                targetName: "P",
                '00:05': "23.00",
                '00:15': "23.03",
                '00:10': "23.02",
              },
              {
                devName:"1",
                targetName: "Q",
                '00:05': "34.00",
                '00:10': "23.02",
                '00:15': "23.03",
              },
              {
                devName:"2",
                targetName: "P",
                '00:05': "34.10",
                '00:10': "23.02",
                '00:15': "23.13",
              },
              {
                devName:"2",
                targetName: "P",
                '00:05': "34.10",
                '00:10': "23.02",
                '00:15': "23.13",
              },
              {
                devName:"3",
                targetName: "la",
                '00:05': "23.00",
                '00:10': "23.02",
                '00:15': "23.03",
              },
              {
                devName:"3",
                targetName: "Q",
                '00:05': "34.00",
                '00:10': "23.02",
                '00:15': "23.03",
              },
        ],
    }
},

methods:{
    //合并方法
    objectSpanMethod({row, column, rowIndex, columnIndex}) {
        //判断是否为第一列
      if (columnIndex == 0) {
        //合并相同的名字
        let nameSpan = this.getSpanNumber(this.tableData, "devName"); //"devName"是要合并的属性名
        return {
          rowspan: nameSpan[rowIndex],
          colspan: 1,
        };
      }
      
      //判断是否为第二列
      if (columnIndex == 1) {
        //合并相同的名字
        let nameSpan = this.getSpanNumber(this.tableData, "devType"); //"devType"是要合并的属性名
        return {
          rowspan: nameSpan[rowIndex],
          colspan: 1,
        };
      }
    },
    //获取要合并的行数,可以直接拿来用,需要在上面方法中调用
    getSpanNumber(data, prop) {
      //data要处理的数组,prop要合并的属性,比如name
      //数组的长度,有时候后台可能返回个null而不是[]
      let length = Array.isArray(data) ? data.length : 0;
      if (length > 0) {
        //用于标识位置
        let position = 0;
        //用于对比的数据
        let temp = data[0][prop];
        //要返回的结果
        let result = [1];
        //假设数据是AABCC,我们的目标就是返回20120
        for (let i = 1; i < length; i++) {
          if (data[i][prop] == temp) {
            //标识位置的数据加一
            result[position] += 1;
            //当前位置添0
            result[i] = 0;
          } else {
            //不相同时,修改标识位置,该位置设为1,修改对比值
            position = i;
            result[i] = 1;
            temp = data[i][prop];
          }
        }
        //返回结果
        return result;
      } else {
        return [0];
      }
    },
 }