转自: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参数实际上是第一列数据标识+第二列标识组合形成的标识,这样判断就会在第一列相同的(也就是合并的状态)时候才会进行第二列的合并。