Layui table 合并单元格

Layui table 合并单元格

合并单元格这里使用的是 done 回调方法,因为是先隐藏相同单元格然后给头行增加合并属性,所以逻辑是:

  1. 循环所有行,每次进入都判断当前行的唯一值是否跟上一个相同
  2. 如果唯一值相同则隐藏对应的单元格并加一合并行计数
  3. 不同就先把之前的行进行合并,然后保存当前行的唯一值
  4. 如果需要合并的单元格下有合计行,计算单元格的合计值
  5. 如果是最后一次循环,进行处理行的合并,不然你会发现列表的最后一行没有合并
  6. 记得把计算的合计值添加到合计行上
ea.table.render({
   init: init,
   totalRow: true,
   cols: [[
       {field: 'warehouse_id',hide:true,search:'false'},
       {type: 'checkbox'},
       {field: 'warehouse.sort', title: '序号',width:70,totalRowText: '合计'},
       {field: 'warehouse.serial_number', title: '流水号',width:120},
       {field: 'warehouse.carNumber.title', title: '车号',width:100},
       {field: 'warehouse.forward.title', title: '发货单位',minWidth:120},
       {field: 'warehouse.consignee.title', title: '收货单位',width:80},
       {field: 'warehouse.goods.title', title: '货品',width:80},
       {field: 'warehouse.standards', title: '规格'},
       {field: 'gross_weight', title: '毛重',width:100,totalRow: true},
       {field: 'tare_weight', title: '皮重',width:100,totalRow: true},
       {field: 'net_weight', title: '净重',width:100,totalRow: true},
       {field: 'type',title: '类型',width:70,search: 'select',selectList: {'-1':'付款',0:'未知',1:'收款',2:'石料',3:'叉车',4:'运费',5:'返点'},templet:function (d) {
               //0.未知 1.收款 2.石料 3.叉车 4.运费 5.返点
               var arr = ['未知','收款','石料','叉车','运费','返点'];
               var color = ['#707070','#00ee00','#00eedf','#eec500','#ee6a00','#EE00DB'];
               return '<span style="color: ' + color[parseInt(d.type)] + '">' + arr[parseInt(d.type)] + '</span>';
           }},
       {field: 'title.title', title: '收付对象',minWidth:120,templet:function (d) {
               return d.title ? d.title.title : '-';
           }},
       {field: 'number', title: '数量',width:70,search: 'false'},
       {field: 'unit',title: '单位',width:70,search: 'false'},
       {field: 'price',title: '单价',width:70,search: 'false'},
       {field: 'payable_amount',title: '应收付金额',width:100,search: 'false',totalRow: true},
       {field: 'amount_paid',title: '已收付金额',width:100,search: 'false',totalRow: true},
       {field: 'pending_amount',title: '待收付金额',width:100,search: 'false',totalRow: true},

       {width: 110, title: '操作',fixed:'right', templet: ea.table.tool},

   ]],
   done: function(){
	    var mark = 1; //计算每次需要合并的格子数
	    var trArr = $(".layui-table-main>.layui-table").find("tr");//所有行
	    var current = '';   //上个处理的数据唯一值
	    var currentRow = '';   //上个处理的行
	    var totalRow = $(".layui-table-total>.layui-table").find("tr").eq(0).find('td'); //合计行
	    var gross_weight = 0;   //毛重
	    var tare_weight = 0;    //皮重
	    var net_weight = 0;     //净重
	
	    trArr.each(function (i, v){
	        var is_same = current === trArr.eq(i).find('td').eq(3).find('div').find('span').text();    // 当前行是否与上个处理行相同
	        if (is_same){
	            //相同则隐藏列
	            for (var k = 0; k < 12; k++) {
	                trArr.eq(i).find('td').eq(k).css('display', 'none');
	            }
	            //计算合并行数
	            mark += 1;
	        }else{
	            // 合并上个处理行
	            if (current){
	                for (var j = 0; j < 12; j++) {
	                    currentRow.eq(j).attr('rowspan', mark);
	                }
	            }
	            //保存当前行
                currentRow = trArr.eq(i).find('td');
                current = currentRow.eq(3).find('div').find('span').text();
	            mark = 1;
	            //计算合计行
	            gross_weight += trArr.eq(i).find('td').eq(9).text() * 1;
	            tare_weight += trArr.eq(i).find('td').eq(10).text() * 1;
	            net_weight += trArr.eq(i).find('td').eq(11).text() * 1;
	        }
	
	        // 循环结束处理合并
	        if (trArr.length - 1 === i){
	            for (var l = 0; l < 12; l++) {
	                currentRow.eq(l).attr('rowspan', mark);
	            }
	        }
	    })
	
	    // 计算合计
	    totalRow.eq(9).find('div').text(Math.round(gross_weight*100)/100);
	    totalRow.eq(10).find('div').text(Math.round(tare_weight*100)/100);
	    totalRow.eq(11).find('div').text(Math.round(net_weight*100)/100);
   }
});

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
layui table是一款基于layui框架的数据表格插件,可以实现表格分页、排序、过滤等功能,而且还支持合并单元格合并单元格主要是指在表格中合并相邻的单元格,将它们合并成一个单元格,从而可以显示更加复杂的数据。 在layui table中,合并单元格有两种方式实现: 第一种方式是通过设置colspan和rowspan属性来合并单元格。具体使用方法如下: table.render({ elem: '#test', cols: [[ //表头 {field: 'id', title: 'ID', width: 80}, {field: 'username', title: '用户名', width: 120}, {field: 'sex', title: '性别', width: 80}, {field: 'city', title: '城市', width: 100}, {field: 'sign', title: '签名', width: 200}, {field: 'experience', title: '积分', width: 100}, {field: 'score', title: '评分', width: 100}, {field: 'classify', title: '职业', width: 100}, {field: 'wealth', title: '财富', width: 100} ]], data: [], done: function(res, curr, count){ //合并单元格 var index = 0; var data = res.data; for(var i=0;i<data.length;i++){ layui.$('#test tr:eq('+index+') td:eq(0)').attr('rowspan', 2); layui.$('#test tr:eq('+index+') td:eq(1)').attr('rowspan', 2); layui.$('#test tr:eq('+index+') td:eq(2)').attr('rowspan', 2); index += 2; } } }); 第二种方式是通过设置lay-id属性来合并单元格。具体使用方法如下: table.render({ elem: '#test', url: '/demo/table/user/', method: 'get', cols: [[ {field:'id', title:'ID', width:80, sort:true, fixed: 'left'} ,{field:'username', title:'用户名', width:120} ,{field:'sex', title:'性别', width:80, sort:true} ,{field:'city', title:'城市', width:100} ,{field:'sign', title:'签名', width:200} ,{field:'experience', title:'积分', width:100, sort:true} ,{field:'score', title:'评分', width:100, sort:true} ,{field:'classify', title:'职业', width:100} ,{field:'wealth', title:'财富', width:135, sort:true, fixed: 'right'} ]], id: 'test', page: true, limit: 10, height: 'full-200', done:function(res, curr, count){ //合并单元格 var data = res.data; var mergeList = ['username','city','classify']; for(var i=0;i<mergeList.length;i++){ var mergeArray = []; var mergeCount = 1; for(var j=0;j<data.length;j++){ if(j==data.length-1){ mergeArray.push(mergeCount); }else{ if(data[j][mergeList[i]]==data[j+1][mergeList[i]]){ mergeCount++; }else{ mergeArray.push(mergeCount); mergeCount = 1; } } } var id = '#' + layui.table.config.id; layui.$(id + ' tbody tr').each(function(rowIndex){ var td = layui.$(this).find('td[data-field='+mergeList[i]+']'); for(var k = 0;k<td.length;k++){ if(mergeArray[rowIndex] && mergeArray[rowIndex]>1){ layui.$(td[k]).attr('rowspan', mergeArray[rowIndex]); mergeArray[rowIndex]--; } } }) } } }); 以上是两种实现layui table合并单元格的方法,具体根据实际需求而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值