使用js多级次合并单元格

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>表格相同内容合并</title> 
 </head> 
 <body>
   合并前: 
  <table width="400" border="1"> 
   <tbody>
    <tr> 
     <th>c1</th> 
     <th>c2</th> 
     <th>c3</th> 
     <th>c4</th> 
     <th>c5</th> 
     <th>c6</th> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>3</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>4</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>5</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>5</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>d</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>e</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
   </tbody>
  </table>
  <br /> 合并后:
  <br /> 
  <table width="400" border="1" id="table1"> 
   <tbody>
    <tr> 
     <th>c1</th> 
     <th>c2</th> 
     <th>c3</th> 
     <th>c4</th> 
     <th>c5</th> 
     <th>c6</th> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>1</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>3</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>4</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>3</td> 
     <td>5</td> 
     <td>6</td> 
     <td>7</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>cc</td> 
     <td>2</td> 
     <td>3</td> 
     <td>5</td> 
     <td>5</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>d</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
    <tr> 
     <td>e</td> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
     <td> </td> 
    </tr> 
   </tbody>
  </table>   
  <script type="text/javascript"> 
	//多级次动态合并表格行
	function checkArray(arr1,arr2){
		for (var i = 0; i < arr1.length; i++) {
			if (arr1[i].innerText===arr2[i].innerText) {

			 }else{
					  return false;
			}
		}
		 return true;
	}
	function dynamicMergeTableRow(tableId){
		  var tb = document.getElementById(tableId);
		  var obj1;
		  var obj2;
		  var objtemp1 = [];
		  var objtemp2 = [];
		  var rowCount = tb.rows.length;
		  console.info(rowCount);
		  var colCount = tb.rows[0].cells.length;
		  console.info(rowCount);
		  var colLength = 4;

		  //命名(表头除外)
		  for (var i = 1; i < rowCount; i++) {
			for (var j = 0; j < colCount; j++) {
			  tb.rows[i].cells[j].id = "tb_" + i.toString() + "_" + j.toString();
			}
		  }

		  //从后往前检查,进行逐列检查合并,开始列为colLength-1
		  for (var col = colLength -1; col >= 0; col--) {
			 //当col>0时有前方的单元格 
			 if (col > 0) {
				//objtemp1为obj1左侧所有单元格集合,初始objtemp1及obj1均从第二行开始(tb_1_)
				for (var l = 0; l < col; l++) {
				   objtemp1[l] = document.getElementById("tb_1_" + l.toString());
				}
			 }
			 obj1 = document.getElementById("tb_1_" + col.toString());

			 //obj2为obj1下方单元格,obj1从第二行开始,则obj2从第三行开始,遍历以row=2为起始值
			 for (var row = 2; row < rowCount; row++) {
					//同obj1及objtemp1,col>0:即有前方单元格,此时有objtemp2
					if (col > 0) {
						for (var l = 0; l < col; l++) {
						   objtemp2[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
						}
					}
					obj2 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());

					//定义完obj1/obj2/objtemp1/objtemp2后,开始合并
					//第一层判断:当obj1的值等于obj2时,即同一列的相邻单元格值相同
					if (obj1.innerText == obj2.innerText) {
						//第二层判断:obj1/obj2所在列前方还有其他列:即col>0(此步判断为单元格合并的依赖性提供支持)
						if (col > 0) {
							//第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值完全相同,可以合并
							if (checkArray(objtemp1,objtemp2)) {
								obj1.rowSpan++;
								obj2.parentNode.removeChild(obj2);
							}
							//第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值不同,不可合并,并重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2          
							else{
								obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());
								for (var l = 0; l < col; l++) {
									objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
								}                  
							}
						}
						//第二层判断:obj1/obj2所在列为首列,直接合并
						else{
							obj1.rowSpan++;
							obj2.parentNode.removeChild(obj2);
						}
					}
					//第一层判断:当obj1的值不等于obj2时,即同一列的相邻单元格值不相,此时重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2
					else{
						obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());
						for (var l = 0; l < col; l++) {
							objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
						}       
					}
			 }
			 objtemp1 = [];
			 objtemp2 = [];
		  }
	}
	dynamicMergeTableRow('table1');
 </script> 
 </body>
</html>

您可以使用 ElementUI 的表格组件中的 `span-method` 属性来合并多级表头。具体地,您需要定义一个方法来返回某个单元格需要跨越多少行或多少列,然后将该方法赋值给 `span-method` 属性即可。 以下是一个示例代码,可以实现合并第三行第一列和第二列表头: ```html <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名" rowspan="3"></el-table-column> <el-table-column label="地址" colspan="2"></el-table-column> <el-table-column label="其他" colspan="3"></el-table-column> </el-table> ``` ```javascript export default { data() { return { tableData: [ { name: '张三', address: '北京', other: '...' }, { name: '李四', address: '上海', other: '...' }, { name: '王五', address: '广州', other: '...' } ] } }, methods: { // 定义合并单元格的方法 mergeCell(rowIndex, columnIndex) { if (rowIndex === 2 && columnIndex === 0) { return { rowspan: 2, colspan: 1 } } else if (rowIndex === 1 && columnIndex === 1) { return { rowspan: 2, colspan: 1 } } } } } ``` 在上面的代码中,我们定义了一个 `mergeCell` 方法来判断某个单元格是否需要合并。具体地,我们判断如果该单元格在第三行第一列或者第二行第二列,就需要跨越两行或两列。 接下来,我们将该方法赋值给表格组件的 `span-method` 属性: ```html <el-table :data="tableData" style="width: 100%" :span-method="mergeCell"> <!-- ... --> </el-table> ``` 这样,就可以实现第三行第一列和第二列表头的合并了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值