【element-ui】el-table合并列+合并行

需求:表格分别存在合计行(特殊样式),小计行(特殊样式),以及同类项目的列合并。el-table本身提供的方法就支持合并行或列,所以主要还是整理数据的功夫❗❗效果图如下:

ps:后台给的数据是一个数组,每一项是小计行的数据,明细数据塞在了小计行数据里,所以需要自己取出来再大整特整✊

渲染代码如下:

<el-table
        border
        :data="busiFinData"
        :span-method="arraySpanMethod"
        :cell-style="getCellStyle"
        >
    <el-table-column
            prop="_prop.finance_type"
            align="center"
            width="180">
    </el-table-column>
    <el-table-column
            prop="prj_code"
            label="项目代码"
            width="180"
            align="center"
    >
    </el-table-column>
    <el-table-column
            prop="prj_name"
            label="项目名称"
            >
    </el-table-column>
    <el-table-column
            prop="_prop.expend_name"
            label="分项名称"
            align="center"
    >
    </el-table-column>
    <el-table-column
            prop="_prop.acc_name"
            label="发放项目"
            align="center"
    >
    </el-table-column>
    <el-table-column
            prop="busi_amt"
            label="应发金额(单位:元)"
            align="right"
            :formatter="el_tableCurrency"
    >
    </el-table-column>
</el-table>

主要逻辑代码如下:

 1、获取表格数据

// 加载表格
loadInaccApply(callback){
    axios({
        method: 'post', url: '/',
        data: {
            ajax: true, act: '', 
        },
    }).then(response => {
        let resp = response.data;
        if (resp.success) {
            // 支出明细
            let busiList = resp.objectMap.busiList || [];
            let busiFin = [], busiTotal = 0;
            busiList.forEach( busi =>{
                if(busi._prop.finance_type == '财政'){
                    this.$set(busi, 'sumSpan', true);     // 小计行添加标志
                    busiFin.push(busi);
                    busiTotal += busi.busi_amt*1;         // 支出合计行金额
                }
            });
            // 获取表格渲染数据
            this.busiFinData = this.getBusiTable(busiFin, busiTotal, '财政');
            callback && callback();
        } else {
            Valert({msg: resp.message});
        }
    }).catch(error=> {
        Valert({msg:error});
    }).finally(()=>{
        this.loading = false;
    });
},

// 整理支出明细
getBusiTable(busi, amt, type){
    let resultArr = [];
    for (let i=0; i<busi.length;i++){
        let infoList = busi[i]._prop && busi[i]._prop.info_list.length ? busi[i]._prop.info_list:[];
        // 具体明细
        for(let j=0; j<infoList.length;j++){
            resultArr.push(infoList[j]);
        }
        // 小计行
        if(type == '财政'){
            resultArr.push(busi[i]);
        }
    }
    // 自定义合计行
    if(resultArr.length){
        if(type == '财政'){
            resultArr.unshift({'busi_amt':amt, 'totalSpan':true,
                _prop:{'finance_type':'财政支出合计', 'expend_name':'', 'acc_name':''}
            });
        }
    }
    return resultArr;
},

2、合并行和列

  

// 合并单元格
arraySpanMethod({ row, column, rowIndex, columnIndex }) {
    // 支出合计行
    if(row.totalSpan){
        if (columnIndex == 5) {
            return [1, 5];
        } else if (columnIndex == 1 || columnIndex == 2 || columnIndex==3 || columnIndex==4 ) {
            return [0, 0];
        }
    }
    // 小计行
    if(row.sumSpan){
        if (columnIndex == 5) {
            return [1, 4];
        } else if (columnIndex == 2 || columnIndex==3 || columnIndex==4 ) {
            return [0, 0];
        }
    }
    // 合并第一列
    if(columnIndex == 0){
        if (rowIndex == 1) { 
            return {
                rowspan: this.busiFinData.length - 1, colspan: 1
            };
        } else if(rowIndex != 0) {
            return {
                rowspan: 0, colspan: 0
            };
        }
    }
},
// 行样式自定义
getCellStyle({ row, column, rowIndex, columnIndex }) {
    if (rowIndex === 0) {
        // 合计行样式
        return 'font-size: 20px; color: #004A99;';
    } else if (row.sumSpan) {
        // 小计行样式
        return "background-color: #EFEFEF; color: #000000;";
    }
    return '';
}

 至此,大功告成😉

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
element-ui的表格el-table本身并不支持动态合并单元格(),但可以通过自定义表格的slot-scope和span-method来实现动态合并单元格的功能。首先,我们需要在表格定义时添加span-method属性,并指定一个方法来计算单元格的合并数和数。例如: ```html <el-table :data="tableData" :span-method="mergeCells"> ... </el-table> ``` 然后,在methods中定义mergeCells方法来计算单元格的合并数和数。该方法有四个参数分别是({row, column, rowIndex, columnIndex}),我们可以根据需要通过判断索引和索引来返回合适的数和数,例如合并第一的两可以这样实现: ```javascript methods: { mergeCells({row, column, rowIndex, columnIndex}) { if (rowIndex === 0 && columnIndex < 2) { return { rowspan: 1, colspan: 2 }; } } } ``` 这样就实现了动态合并第一的两个单元格。如果想要合并其他,可以根据需要进判断和返回。 给表头添加斜线可以通过自定义表头的样式来实现。可以通过CSS的`::before`或`::after`伪元素来添加斜线样式。例如,给第一的表头添加斜线可以这样实现: ```html <el-table ...> <el-table-column label="姓名"> <template slot="header" slot-scope="scope"> <div class="header-wrapper"> <div class="header-content"> <span>{{scope.column.label}}</span> </div> </div> </template> </el-table-column> ... </el-table> ``` 然后在样式中定义斜线效果: ```css <style> .header-content::before { content: ""; display: block; border-bottom: 1px solid #333; transform: skew(-45deg); width: 80%; margin-left: 10%; } </style> ``` 这样就实现了给第一的表头添加斜线的效果。可以根据需要调整斜线的样式和位置来达到期望的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值