一、element控件實現
在平常的應用中,需要用到合並單元格的操作,在Excel中,這種操作很好實現,但在實際項目中,常常需要借助element控件來實現。
下面是element中的一個實例:

實現的代碼如下:
<template>
<div>
<el-table
:data="tableData"
:span-method="arraySpanMethod"
border
style="width: 100%">
<el-table-column
prop="id"
label="ID"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="amount1"
sortable
label="數值 1">
</el-table-column>
<el-table-column
prop="amount2"
sortable
label="數值 2">
</el-table-column>
<el-table-column
prop="amount3"
sortable
label="數值 3">
</el-table-column>
</el-table>
<el-table
:data="tableData"
:span-method="objectSpanMethod"
border
style="width: 100%; margin-top: 20px">
<el-table-column
prop="id"
label="ID"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="amount1"
label="數值 1(元)">
</el-table-column>
<el-table-column
prop="amount2"
label="數值 2(元)">
</el-table-column>
<el-table-column
prop="amount3"
label="數值 3(元)">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [{
id: '12987122',
name: '王小虎',
amount1: '234',
amount2: '3.2',
amount3: 10
}, {
id: '12987123',
name: '王小虎',
amount1: '165',
amount2: '4.43',
amount3: 12
}, {
id: '12987124',
name: '王小虎',
amount1: '324',
amount2: '1.9',
amount3: 9
}, {
id: '12987125',
name: '王小虎',
amount1: '621',
amount2: '2.2',
amount3: 17
}, {
id: '12987126',
name: '王小虎',
amount1: '539',
amount2: '4.1',
amount3: 15
}]
};
},
methods: {
arraySpanMethod({ row, column, rowIndex, columnIndex }) {
if (rowIndex % 2 === 0) {
if (columnIndex === 0) {
return [1, 2];
} else if (columnIndex === 1) {
return [0, 0];
}
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1
};
} else {
return {
rowspan: 0,
colspan: 0
};
}
}
}
}
};
</script>
二、原生方法實現
但是,這種局限性很大,要是需要合並的單元格和實例中的不匹配,那就不行了。比如說實際需求是下面的這種形式的表格:

開始用element控件發現實現不了,然后最后用原生方法實現的,關鍵代碼如下:
<table>
<thead>
<th>數據類型</th>
<th>名稱</th>
<th></th>
<th></th>
</thead>
<tbody>
<template v-for="(item,index) in tableData">
<tr :key="index">
<td :rowspan="item.rowSpanData.length">{{item.rowSpanName}}</td>
<td >{{item.rowSpanData[0].value01}}</td>
<td >{{item.rowSpanData[0].value02}}</td>
<td >{{item.rowSpanData[0].value03}}</td>
</tr>
<tr v-for="(ele,inx) in item.rowSpanData.length-1" :key="index+'-'+inx">
<td>{{item.rowSpanData[ele].value01}}</td>
<td>{{item.rowSpanData[ele].value02}}</td>
<td>{{item.rowSpanData[ele].value03}}</td>
</tr>
</template>
</tbody>
</table>
tableData: [
{
rowSpanName: "基礎數據",
rowSpanData: [
{
value01: "鑽井層位()",
value02: "",
value03: ""
},
{
value01: "上層套管尺寸(in)",
value02: "",
value03: ""
},
{
value01: "上層套管下深(m)",
value02: "",
value03: ""
},
{
value01: "本層鑽頭尺寸(in)",
value02: "7.5",
value03: ""
},
{
value01: "本層井深(m)",
value02: "5950",
value03: ""
},
{
value01: "本層井底部垂深(m)",
value02: "",
value03: ""
},
{
value01: "本層套管尺寸(in)",
value02: "4",
value03: ""
},
{
value01: "本層套管下深(m)",
value02: "5948.6",
value03: ""
},
{
value01: "浮箍下深(m)",
value02: "5928.6",
value03: ""
},
{
value01: "球座/阻流環下深(m)",
value02: "5928.6",
value03: ""
},
{
value01: "分級箍頂深(m)",
value02: "",
value03: ""
},
{
value01: "尾管掛頂深(m)",
value02: "3050",
value03: ""
},
]
},
{
rowSpanName: "地質分層",
rowSpanData: [
{
value01: "層位()",
value02: "",
value03: ""
},
{
value01: "底深(m)",
value02: "",
value03: ""
},
{
value01: "主要岩性描述()",
value02: "",
value03: ""
}
]
},
{
rowSpanName: "其他",
rowSpanData: [
{
value01: "目的層1頂深(m)",
value02: "",
value03: ""
},
{
value01: "目的層1頂深TVD(m)",
value02: "",
value03: ""
}
]
}
],
<style scoped>
table {
width: 600px;
border: 1px solid #ccc;
border-collapse: collapse;
}
thead th{
text-align: left;
background-color: #fafafa;
}
th,td {
padding-left: 20px;
border: 1px solid #e9eaec;
line-height: 30px;
}
</style>
實現的效果如下:

以上就是實際需求中的一個例子,element控件應該也能實現第二種多行合並的表格,后面可以深入研究一下。
