转自:https://www.cnblogs.com/chen-yi-yi/p/11224346.html
通过 span-method 绑定方法 objectSpanMethod方法
this.getSpanArr(this.tableData); //this.tableData 指接口取到的数据
// 2、 因为要合并的行数是不固定的,此函数是实现合并随意行数的功能
getSpanArr(data) {
this.spanArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
// 如果是第一条记录(即索引是0的时候),向数组中加入1
this.spanArr.push(1);
this.pos = 0;
} else {
if (data[i].parentCode === data[i - 1].parentCode) {
// 如果parentCode相等就累加,并且push 0 这里是根据一样的parentCode匹配
this.spanArr[this.pos] += 1;
this.spanArr.push(0);
} else {
// 不相等push 1
this.spanArr.push(1);
this.pos = i;
}
}
}
},
// 3、合并行数
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// columnIndex === 0 找到第一列,实现合并随机出现的行数
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
};
}
},
可根据需求进行调整,上面的只是第一列合并,如果需求需要多列内容分别合并,且后面几列需要在前一列合并的基础上合并,该怎么做呢?
/**
* 获取XXXXX列数据,判断上下两个数据是否一致
* 将对应列数据初始化为空数组,第一个数据默认为1
* 如果上下数据一致,则对应下标的数值+1,并同时push一个0
* 示例:【1,1,2,0,1】则表示第三行数据合并,合并两行,并删除第四行数据
*/
getMatterArr(data, name) {
this.matterArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.matterArr.push(1);
this.pos = 0;
} else {
if (data[i][name] === data[i - 1][name]) {
this.matterArr[this.pos] += 1;
this.matterArr.push(0);
} else {
this.matterArr.push(1);
this.pos = i;
}
}
}
},
/**
* 获取XXXX列数据,判断上下两个数据是否一致
* 将对应列数据初始化为空数组,第一个数据默认为1
* 如果上下数据一致,则对应下标的数值+1,并同时push一个0
* 示例:【1,1,2,0,1】则表示第三行数据合并,合并两行,并删除第四行数据
*/
getReMatterArr(data, name) {
this.reMatterArr = [];
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.reMatterArr.push(1);
this.index = 0;
} else {
if (data[i][name] === data[i - 1][name]) {
this.reMatterArr[this.index] += 1;
this.reMatterArr.push(0);
} else {
this.reMatterArr.push(1);
this.index = i;
}
}
}
},
/**
* 合并行数据
* 如果抵消事项数据第二个数据和前一个数据一样,则将其行进行合并
* 报表事项则先判断对应的抵消事项是否合并,如果抵消事项处于合并状态,则其后面的报表事项允许合并
* @param rowIndex第几行,columnIndex第几列
* @param matterCode,第一个判断数据是否一致的字段
* @param secondColumnKey 第二列判断是否一致的字段(该字段是由第一列标识 + 第二列标识合并得到的,由后台返回的 )
*/
mergeColumn({ row, column, rowIndex, columnIndex }) {
// columnIndex === 0 找到第一列,实现抵消事项合并
if (columnIndex === 0) {
this.getMatterArr(this.pageData, "matterCode");
const _row = this.matterArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
if (columnIndex === 1) {
//第二列报表事项的合并
this.getReMatterArr(this.pageData, "secondColumnKey");
const _row = this.reMatterArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
},
getReMatterArr与getMatterArr 方法实际上是一个功能,但因为执行顺序的原因所以分开了,暂时没想到好的能合并到一起的方法。
secondColumnKey参数实际上是第一列数据标识+第二列标识组合形成的标识,这样判断就会在第一列相同的(也就是合并的状态)时候才会进行第二列的合并。
