效果图

<el-table
class="ncky-detail-table"
v-loading="tableLoading"
border
:data="tableDataVo"
:span-method="objectSpanMethod"
row-key="uniqueFlag"
:row-class-name="tablerowclassname"
>
<el-table-column label="序号" width="50" align="center" prop="rowId" />
...
</el-table>
合并行、列
getSpanArr(data) {
let _spanArr = [];
let rowId = 0;//存储序号
// 遍历数据
for (let i = 0; i < data.length; i++) {
// 如果是第一个数据,就将列表spanArr添加一个1,表示暂时只有一个名字相同的、且将索引pos赋值为0
if (i === 0) {
_spanArr.push(1);
this.pos = 0;
data[i].rowId = 1;//序号合并
} else {
// 判断当前元素与上一个元素是否相同
if (data[i].infoId === data[i - 1].infoId) {
// 如果相同就将索引为 pos 的值加一
_spanArr[this.pos] += 1;
// 且将数组添加 0
_spanArr.push(0);
} else {
// 如果元素不同了,就可以通过索引为 pos 的值知晓应该需要合并的行数
// 同时,我们再次添加一个值1,表示重新开始判断重复姓名的次数
_spanArr.push(1);
// 同时 索引加一
this.pos = i;
rowId++;
data[i].rowId = rowId + 1;
}
}
}
this.spanArr = _spanArr;
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex < 6 || columnIndex === 9 || columnIndex === 10 || columnIndex === 15 || columnIndex === 16) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
},
// 表格行样式背景颜色
tablerowclassname({ row, rowIndex }) {
if (a != b) {
return 'warning-row';
}
},