动态合并el-table单元格
初始表格
html
<el-table
:data="tableData_origin"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column prop="School" label="学校" align="center">
</el-table-column>
<el-table-column prop="Grade" label="年级" align="center" />
<el-table-column prop="Name" label="姓名" align="center" />
<el-table-column prop="Chinese" label="语文" align="center" />
<el-table-column prop="Math" label="数学" align="center" />
<el-table-column prop="English" label="英语" align="center" />
<el-table-column prop="k_Class" label="班级" align="center" />
</el-table><el-table
:data="tableData_origin"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column prop="School" label="学校" align="center">
</el-table-column>
<el-table-column prop="Grade" label="年级" align="center" />
<el-table-column prop="Name" label="姓名" align="center" />
<el-table-column prop="Chinese" label="语文" align="center" />
<el-table-column prop="Math" label="数学" align="center" />
<el-table-column prop="English" label="英语" align="center" />
<el-table-column prop="k_Class" label="班级" align="center" />
</el-table>合并单元格之后
html
<el-table
:data="tableData"
:span-method="objectSpanMethod"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column prop="School" label="学校" align="center">
</el-table-column>
<el-table-column prop="Grade" label="年级" align="center" />
<el-table-column prop="k_Class" label="班级" align="center" />
<el-table-column prop="Name" label="姓名" align="center" />
<el-table-column prop="Chinese" label="语文" align="center" />
<el-table-column prop="Math" label="数学" align="center" />
<el-table-column prop="English" label="英语" align="center" />
</el-table><el-table
:data="tableData"
:span-method="objectSpanMethod"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column prop="School" label="学校" align="center">
</el-table-column>
<el-table-column prop="Grade" label="年级" align="center" />
<el-table-column prop="k_Class" label="班级" align="center" />
<el-table-column prop="Name" label="姓名" align="center" />
<el-table-column prop="Chinese" label="语文" align="center" />
<el-table-column prop="Math" label="数学" align="center" />
<el-table-column prop="English" label="英语" align="center" />
</el-table>js
export default {
data () {
return {
// 存放所有的表头 一定要与tableData一致
colFields: [
"School",
"Grade",
"k_Class",
"Name",
"Chinese",
"Math",
"English",
],
spanArr: [], //存储合并单元格的开始位置
// 表格数据
tableData: [],
tableData_origin: [
// 一年级
{
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张三",
Chinese: "90",
Math: "100",
English: "1",
}, {
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张三",
Chinese: "90",
Math: "100",
English: "12",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张伟",
Chinese: "90",
Math: "99",
English: "89",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "2班",
Name: "李四",
Chinese: "90",
Math: "85",
English: "123",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "3班",
Name: "王五",
Chinese: "79",
Math: "100",
English: "1234",
},
// 二年级
{
School: "第一小学",
Grade: "2年级",
k_Class: "1班",
Name: "赵六",
Chinese: "95",
Math: "100",
English: "1234",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "2班",
Name: "钱八",
Chinese: "98",
Math: "85",
English: "12354",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "2班",
Name: "张三",
Chinese: "98",
Math: "85",
English: "12354",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "3班",
Name: "陈九",
Chinese: "79",
Math: "100",
English: "100",
},
// 三年级
{
School: "第一小学",
Grade: "3年级",
k_Class: "1班",
Name: "黄十",
Chinese: "91",
Math: "88",
English: "12354",
},
{
School: "第一小学",
Grade: "3年级",
k_Class: "2班",
Name: "魏一",
Chinese: "90",
Math: "86",
English: "87",
},
{
School: "第一小学",
Grade: "3年级",
k_Class: "3班",
Name: "杨二",
Chinese: "79",
Math: "99",
English: "12354",
},
// 第二小学
{
School: "第二小学",
Grade: "3年级",
k_Class: "3班",
Name: "袁零",
Chinese: "79",
Math: "99",
English: "123546",
},
{
School: "第二小学",
Grade: "3年级",
k_Class: "2班",
Name: "袁零2",
Chinese: "79",
Math: "99",
English: "123546",
},
{
School: "第二小学",
Grade: "3年级",
k_Class: "2班",
Name: "袁零3",
Chinese: "79",
Math: "99",
English: "123546",
},
],
};
},
methods: {
/**
* 分析每一列,找出相同的
* @param data
*/
getSpanArr () {
this.tableData = JSON.parse(JSON.stringify(this.tableData_origin));
for (let i = 0; i < this.tableData.length; i++) {
let row = i;
// let col = i % this.colCount;
if (row === 0) {
// i 表示行 j表示列
for (let j = 0; j < this.colFields.length; j++) {
this.spanArr[i * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
} else {
for (let j = 0; j < this.colFields.length; j++) {
// 当前和上一次的一样
// 合并所有列的相同数据单元格
if (
this.colFields[j] == "School" ||
this.colFields[j] == "Grade" ||
this.colFields[j] == "k_Class" ||
this.colFields[j] == "Name" ||
this.colFields[j] == "Chinese" ||
this.colFields[j] == "Math" ||
this.colFields[j] == "English"
) { // 指定合并哪些列
if (
this.tableData[row]["Grade"] !==
this.tableData[row - 1]["Grade"]
) { // 哪些不合并:School不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.colFields[j] == "Name" ||
this.colFields[j] == "Chinese" ||
this.colFields[j] == "Math"
) { // 哪些不合并:School不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
(this.tableData[row][this.colFields[j]] ===
this.tableData[row - 1][this.colFields[j]])
) {
let beforeItem =
this.spanArr[(row - 1) * this.colFields.length + j];
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1 + beforeItem.rowspan,// 合并几列
colspan: 1,// 合并几行
};
beforeItem.rowspan = 0;
beforeItem.colspan = 0;
} else {
// rowspan 和 colspan 都为1表格此单元格不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
}
}
}
}
// 对数据进行倒序
let stack = [];
for (let i = 0; i < this.colFields.length; i++) {
for (let j = 0; j < this.tableData.length; j++) {
// console.log("i=" + i + " j=" + j);
// i 表示列 j表示行
if (j === 0) {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
}
} else {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
} else {
stack.push(this.spanArr[j * this.colFields.length + i]);
while (stack.length > 0) {
let pop = stack.pop();
let len = stack.length;
this.spanArr[(j - len) * this.colFields.length + i] = pop;
}
}
}
}
}
// console.log(this.spanArr);
},
objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
// console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
return this.spanArr[rowIndex * this.colFields.length + columnIndex];
},
},
mounted () {
this.getSpanArr();
},
};export default {
data () {
return {
// 存放所有的表头 一定要与tableData一致
colFields: [
"School",
"Grade",
"k_Class",
"Name",
"Chinese",
"Math",
"English",
],
spanArr: [], //存储合并单元格的开始位置
// 表格数据
tableData: [],
tableData_origin: [
// 一年级
{
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张三",
Chinese: "90",
Math: "100",
English: "1",
}, {
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张三",
Chinese: "90",
Math: "100",
English: "12",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "1班",
Name: "张伟",
Chinese: "90",
Math: "99",
English: "89",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "2班",
Name: "李四",
Chinese: "90",
Math: "85",
English: "123",
},
{
School: "第一小学",
Grade: "1年级",
k_Class: "3班",
Name: "王五",
Chinese: "79",
Math: "100",
English: "1234",
},
// 二年级
{
School: "第一小学",
Grade: "2年级",
k_Class: "1班",
Name: "赵六",
Chinese: "95",
Math: "100",
English: "1234",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "2班",
Name: "钱八",
Chinese: "98",
Math: "85",
English: "12354",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "2班",
Name: "张三",
Chinese: "98",
Math: "85",
English: "12354",
},
{
School: "第一小学",
Grade: "2年级",
k_Class: "3班",
Name: "陈九",
Chinese: "79",
Math: "100",
English: "100",
},
// 三年级
{
School: "第一小学",
Grade: "3年级",
k_Class: "1班",
Name: "黄十",
Chinese: "91",
Math: "88",
English: "12354",
},
{
School: "第一小学",
Grade: "3年级",
k_Class: "2班",
Name: "魏一",
Chinese: "90",
Math: "86",
English: "87",
},
{
School: "第一小学",
Grade: "3年级",
k_Class: "3班",
Name: "杨二",
Chinese: "79",
Math: "99",
English: "12354",
},
// 第二小学
{
School: "第二小学",
Grade: "3年级",
k_Class: "3班",
Name: "袁零",
Chinese: "79",
Math: "99",
English: "123546",
},
{
School: "第二小学",
Grade: "3年级",
k_Class: "2班",
Name: "袁零2",
Chinese: "79",
Math: "99",
English: "123546",
},
{
School: "第二小学",
Grade: "3年级",
k_Class: "2班",
Name: "袁零3",
Chinese: "79",
Math: "99",
English: "123546",
},
],
};
},
methods: {
/**
* 分析每一列,找出相同的
* @param data
*/
getSpanArr () {
this.tableData = JSON.parse(JSON.stringify(this.tableData_origin));
for (let i = 0; i < this.tableData.length; i++) {
let row = i;
// let col = i % this.colCount;
if (row === 0) {
// i 表示行 j表示列
for (let j = 0; j < this.colFields.length; j++) {
this.spanArr[i * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
} else {
for (let j = 0; j < this.colFields.length; j++) {
// 当前和上一次的一样
// 合并所有列的相同数据单元格
if (
this.colFields[j] == "School" ||
this.colFields[j] == "Grade" ||
this.colFields[j] == "k_Class" ||
this.colFields[j] == "Name" ||
this.colFields[j] == "Chinese" ||
this.colFields[j] == "Math" ||
this.colFields[j] == "English"
) { // 指定合并哪些列
if (
this.tableData[row]["Grade"] !==
this.tableData[row - 1]["Grade"]
) { // 哪些不合并:School不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.colFields[j] == "Name" ||
this.colFields[j] == "Chinese" ||
this.colFields[j] == "Math"
) { // 哪些不合并:School不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
(this.tableData[row][this.colFields[j]] ===
this.tableData[row - 1][this.colFields[j]])
) {
let beforeItem =
this.spanArr[(row - 1) * this.colFields.length + j];
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1 + beforeItem.rowspan,// 合并几列
colspan: 1,// 合并几行
};
beforeItem.rowspan = 0;
beforeItem.colspan = 0;
} else {
// rowspan 和 colspan 都为1表格此单元格不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
}
}
}
}
// 对数据进行倒序
let stack = [];
for (let i = 0; i < this.colFields.length; i++) {
for (let j = 0; j < this.tableData.length; j++) {
// console.log("i=" + i + " j=" + j);
// i 表示列 j表示行
if (j === 0) {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
}
} else {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
} else {
stack.push(this.spanArr[j * this.colFields.length + i]);
while (stack.length > 0) {
let pop = stack.pop();
let len = stack.length;
this.spanArr[(j - len) * this.colFields.length + i] = pop;
}
}
}
}
}
// console.log(this.spanArr);
},
objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
// console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
return this.spanArr[rowIndex * this.colFields.length + columnIndex];
},
},
mounted () {
this.getSpanArr();
},
};隔N个列动态合并单元格的行
初始表格
html
<el-table
:data="tableData_origin"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column
prop="trailerPerson"
label="拖车人姓名"
align="center"
width="150px"
>
</el-table-column>
<el-table-column
prop="trailerNum"
label="拖车人数"
align="center"
width="80px"
/>
<el-table-column
prop="trailerTypeDic"
label="拖车类型"
align="center"
width="150px"
/>
<el-table-column
prop="num"
label="作业次数"
align="center"
width="50px"
/>
<el-table-column
prop="variousTypesOfAverages"
label="各类拖车处置平均用时"
align="center"
width="150px"
/>
<el-table-column
prop="averageTime"
label="平均处置用时"
align="center"
width="150px"
/>
</el-table><el-table
:data="tableData_origin"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column
prop="trailerPerson"
label="拖车人姓名"
align="center"
width="150px"
>
</el-table-column>
<el-table-column
prop="trailerNum"
label="拖车人数"
align="center"
width="80px"
/>
<el-table-column
prop="trailerTypeDic"
label="拖车类型"
align="center"
width="150px"
/>
<el-table-column
prop="num"
label="作业次数"
align="center"
width="50px"
/>
<el-table-column
prop="variousTypesOfAverages"
label="各类拖车处置平均用时"
align="center"
width="150px"
/>
<el-table-column
prop="averageTime"
label="平均处置用时"
align="center"
width="150px"
/>
</el-table>合并单元格之后 有时要求单元格列之间间隔几个不需要合并的列,而后面需要合并的行收到最前方几列的限制
html
<el-table
:data="tableData"
:span-method="objectSpanMethod"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column
prop="trailerPerson"
label="拖车人姓名"
align="center"
width="150px"
>
</el-table-column>
<el-table-column
prop="trailerNum"
label="拖车人数"
align="center"
width="80px"
/>
<el-table-column
prop="trailerTypeDic"
label="拖车类型"
align="center"
width="150px"
/>
<el-table-column
prop="num"
label="作业次数"
align="center"
width="50px"
/>
<el-table-column
prop="variousTypesOfAverages"
label="各类拖车处置平均用时"
align="center"
width="150px"
/>
<el-table-column
prop="averageTime"
label="平均处置用时"
align="center"
width="150px"
/>
</el-table><el-table
:data="tableData"
:span-method="objectSpanMethod"
border
:header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
>
<el-table-column
prop="trailerPerson"
label="拖车人姓名"
align="center"
width="150px"
>
</el-table-column>
<el-table-column
prop="trailerNum"
label="拖车人数"
align="center"
width="80px"
/>
<el-table-column
prop="trailerTypeDic"
label="拖车类型"
align="center"
width="150px"
/>
<el-table-column
prop="num"
label="作业次数"
align="center"
width="50px"
/>
<el-table-column
prop="variousTypesOfAverages"
label="各类拖车处置平均用时"
align="center"
width="150px"
/>
<el-table-column
prop="averageTime"
label="平均处置用时"
align="center"
width="150px"
/>
</el-table>js
export default {
data () {
return {
// 存放所有的表头 一定要与tableData一致
colFields: [
"trailerPerson",
"trailerNum",
"num",
"trailerTypeDic",
"variousTypesOfAverages",
"averageTime",
],
spanArr: [], //存储合并单元格的开始位置
// 表格数据
tableData: [],
tableData_origin: [
{
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '小拖车',
"num": 1,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '大拖车',
"num": 2,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '大平板',
"num": 3,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '小拖车',
"num": 1,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '大拖车',
"num": 2,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '大平板',
"num": 3,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '老五',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
},
],
};
},
mounted () {
this.getSpanArr();
},
methods: {
getSpanArr () {
this.tableData = JSON.parse(JSON.stringify(this.tableData_origin));
for (let i = 0; i < this.tableData.length; i++) {
let row = i;
// let col = i % this.colCount;
if (row === 0) {
// i 表示行 j表示列
for (let j = 0; j < this.colFields.length; j++) {
this.spanArr[i * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
} else {
for (let j = 0; j < this.colFields.length; j++) {
// 合并所有列的相同数据单元格
if (
this.colFields[j] == "trailerPerson" ||
this.colFields[j] == "trailerNum" ||
this.colFields[j] == "num" ||
this.colFields[j] == "trailerTypeDic" ||
this.colFields[j] == "variousTypesOfAverages" ||
this.colFields[j] == "averageTime"
) { // 指定合并哪些列
if (
(this.tableData[row]["trailerPerson"] !==
this.tableData[row - 1]["trailerPerson"]) || (this.tableData[row]["trailerNum"] !==
this.tableData[row - 1]["trailerNum"] &&
this.colFields[j] == "averageTime")
// 这里如果指定拖车人姓名和拖车人数同时作为限制的话,拖车人姓名也会被拖车人数切开,所以加一个trailerNum&&averageTime的限制
) { // 哪些不合并:trailerPerson、trailerNum不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.colFields[j] == "num" ||
this.colFields[j] == "trailerTypeDic" ||
this.colFields[j] == "variousTypesOfAverages"
) { // 首先,合并所有列的相同数据单元格,然后再剔除不需要合并的单元格,否则会出现显示BUG
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.tableData[row][this.colFields[j]] ===
this.tableData[row - 1][this.colFields[j]]
) {
let beforeItem =
this.spanArr[(row - 1) * this.colFields.length + j];
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1 + beforeItem.rowspan,// 合并几列
colspan: 1,// 合并几行
};
beforeItem.rowspan = 0;
beforeItem.colspan = 0;
} else {
// rowspan 和 colspan 都为1表格此单元格不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
}
}
}
}
// 对数据进行倒序
let stack = [];
for (let i = 0; i < this.colFields.length; i++) {
for (let j = 0; j < this.tableData.length; j++) {
// console.log("i=" + i + " j=" + j);
// i 表示列 j表示行
if (j === 0) {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
}
} else {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
} else {
stack.push(this.spanArr[j * this.colFields.length + i]);
while (stack.length > 0) {
let pop = stack.pop();
let len = stack.length;
this.spanArr[(j - len) * this.colFields.length + i] = pop;
}
}
}
}
}
// console.log(this.spanArr);
},
objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
// console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
return this.spanArr[rowIndex * this.colFields.length + columnIndex];
},
},
};export default {
data () {
return {
// 存放所有的表头 一定要与tableData一致
colFields: [
"trailerPerson",
"trailerNum",
"num",
"trailerTypeDic",
"variousTypesOfAverages",
"averageTime",
],
spanArr: [], //存储合并单元格的开始位置
// 表格数据
tableData: [],
tableData_origin: [
{
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '小拖车',
"num": 1,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '大拖车',
"num": 2,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '大平板',
"num": 3,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '单人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '双人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '张三',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '小拖车',
"num": 1,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '大拖车',
"num": 2,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '大平板',
"num": 3,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '单人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '双人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '小拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '大拖车',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '大平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '李四',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
}, {
"trailerPerson": '老五',
"trailerNum": '多人',
"trailerTypeDic": '小平板',
"num": 4,
"variousTypesOfAverages": 139.7143,
"averageTime": 12,
},
],
};
},
mounted () {
this.getSpanArr();
},
methods: {
getSpanArr () {
this.tableData = JSON.parse(JSON.stringify(this.tableData_origin));
for (let i = 0; i < this.tableData.length; i++) {
let row = i;
// let col = i % this.colCount;
if (row === 0) {
// i 表示行 j表示列
for (let j = 0; j < this.colFields.length; j++) {
this.spanArr[i * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
} else {
for (let j = 0; j < this.colFields.length; j++) {
// 合并所有列的相同数据单元格
if (
this.colFields[j] == "trailerPerson" ||
this.colFields[j] == "trailerNum" ||
this.colFields[j] == "num" ||
this.colFields[j] == "trailerTypeDic" ||
this.colFields[j] == "variousTypesOfAverages" ||
this.colFields[j] == "averageTime"
) { // 指定合并哪些列
if (
(this.tableData[row]["trailerPerson"] !==
this.tableData[row - 1]["trailerPerson"]) || (this.tableData[row]["trailerNum"] !==
this.tableData[row - 1]["trailerNum"] &&
this.colFields[j] == "averageTime")
// 这里如果指定拖车人姓名和拖车人数同时作为限制的话,拖车人姓名也会被拖车人数切开,所以加一个trailerNum&&averageTime的限制
) { // 哪些不合并:trailerPerson、trailerNum不一样的,不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.colFields[j] == "num" ||
this.colFields[j] == "trailerTypeDic" ||
this.colFields[j] == "variousTypesOfAverages"
) { // 首先,合并所有列的相同数据单元格,然后再剔除不需要合并的单元格,否则会出现显示BUG
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
} else if (
this.tableData[row][this.colFields[j]] ===
this.tableData[row - 1][this.colFields[j]]
) {
let beforeItem =
this.spanArr[(row - 1) * this.colFields.length + j];
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1 + beforeItem.rowspan,// 合并几列
colspan: 1,// 合并几行
};
beforeItem.rowspan = 0;
beforeItem.colspan = 0;
} else {
// rowspan 和 colspan 都为1表格此单元格不合并
this.spanArr[row * this.colFields.length + j] = {
rowspan: 1,
colspan: 1,
};
}
}
}
}
}
// 对数据进行倒序
let stack = [];
for (let i = 0; i < this.colFields.length; i++) {
for (let j = 0; j < this.tableData.length; j++) {
// console.log("i=" + i + " j=" + j);
// i 表示列 j表示行
if (j === 0) {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
}
} else {
if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
stack.push(this.spanArr[j * this.colFields.length + i]);
} else {
stack.push(this.spanArr[j * this.colFields.length + i]);
while (stack.length > 0) {
let pop = stack.pop();
let len = stack.length;
this.spanArr[(j - len) * this.colFields.length + i] = pop;
}
}
}
}
}
// console.log(this.spanArr);
},
objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
// console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
return this.spanArr[rowIndex * this.colFields.length + columnIndex];
},
},
};
liang14658fox