【表格插入小计行】el-table表格,数组对象中根据某字段插入小计行计算数据

2023-09-21 09:19:53

前言

功能解释:遇到的一个需求,是表格的tabledata数组。里面有科室医生还有很多消费指标等数据。然后需要我排序后把科室放在一起。然后在每个科室下面添加一行数据,是小计行。用于计算上面相同科室的所有数据汇总。然后最下面再来个合计行,加上所有的小计。

效果图

刚排序后是这样的表格样子,数据是我模拟的
在这里插入图片描述
然后插入小计行后是这样的。
在这里插入图片描述

实现方法

逻辑流程:
1,请求拿到表格的数据tableData
2,把数组排序,让科室都在一起,然后合并单元格
3,循环数组,找出对应科室的角标保存到一个数组中,并用科室命名。
4,反转数组,从后面往前面插入,因为从前面开始插入会导致角标变化
5,计算好小计行直接插入就完事了。

代码

可以直接复制查看效果,改改字段就可以用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 公共css文件 -->
    <script src="./ceshi.js"></script>
    <link rel="stylesheet" href="/statics/css/common/common.css">
    <!-- 公共js文件 -->
    <script type="text/javascript" src="/statics/vue_element/common.js"></script>
    <!-- vue方面文件 -->
    <script src="/statics/vue_element/vue.js"></script>
    <script src="/statics/vue_element/element.js"></script>
    <link rel="stylesheet" href="/statics/vue_element/element.css">
    <script src="/statics/vue_element/axios.js"></script>
    <script src="/mixins/quanxian.js"></script>
    <title>测试页</title>
</head>

<body>
    <div id="app" style="padding:10px;">
        <el-table :data="tableDatas" border style="width: 100%" ref="configurationTable" :row-style="rowstyle"
            :span-method="objectSpanMethod">
            <el-table-column v-for="(arrd,index) in headers" :key="index" :label="arrd.name" align="center" width='100'
                show-overflow-tooltip>
                <!-- 有子级 -->
                <el-table-column v-for="(arrd2,index2) in arrd.child" align="center" :label="arrd2.name"
                    show-overflow-tooltip>
                    <template slot-scope="{row, $index}">
                        <span>{{row[arrd2.key]}}</span>
                    </template>
                </el-table-column>
                <!-- 无子级 -->
                <template slot-scope="{row, $index}">
                    <span>{{row[arrd.key]}}</span>
                </template>
            </el-table-column>
        </el-table>
    </div>
</body>
<script type="text/javascript">
    let v = new Vue({
        el: '#app',
        data() {
            return {
                tableDatas: [],//表体
                headers: [],//表头
                spanArr: []//合并单元格
            }
        },
        mounted() {
            this.searchList()
        },
        methods: {
            // 模拟发送请求,拿到表格数据
            searchList() {
                let that = this
                that.tableShow = false
                // 模拟数据
                that.headers = [{
                            child: [],
                            key: "ks",
                            name: "科室"
                        },
                        {
                            child: [],
                            key: "doctor",
                            name: "医生"
                        },
                        {
                            child: [],
                            key: "ghl",
                            name: "挂号"
                        },
                        {
                            child: [],
                            key: "jzl",
                            name: "就诊"
                        },
                        {
                            child: [],
                            key: "jz",
                            name: "体检"
                        }
                    ],
                    that.tableDatas = [{
                        ks: "中医科",
                        doctor: '中医科医生1',
                        ghl: 6,
                        jzl: 5,
                        jz: 2,
                    }, {
                        ks: "中医科",
                        doctor: '中医科医生2',
                        ghl: 9,
                        jzl: 4,
                        jz: 3,
                    }, {
                        ks: "外科",
                        doctor: '外科医生2',
                        ghl: 7,
                        jzl: 3,
                        jz: 4,
                    }, {
                        ks: "外科",
                        doctor: '外科医生1',
                        ghl: 5,
                        jzl: 1,
                        jz: 5,
                    }, {
                        ks: "内科",
                        doctor: '内科医生3',
                        ghl: 2,
                        jzl: 1,
                        jz: 6,
                    }, {
                        ks: "内科",
                        doctor: '内科医生1',
                        ghl: 2,
                        jzl: 12,
                        jz: 7,
                    }]
                this.tableDatas.sort(this.mysort);
                this.groupHandle(that.tableDatas)
                let hj = this.hj(that.tableDatas)
                this.tableDatas.push(hj)
                this.setdates()
            },
            // 根据科室排序
            mysort(a, b) {
                if (a.ks !== b.ks) {
                    if (a.ks !== null && a.ks !== undefined) {
                        return a.ks < b.ks ? -1 : 1;
                    } else {
                        return -1;
                    }
                }
            },
            // 计算小计行插入位置
            groupHandle(Human) {
                let doctorMap = {};
                for (let i = 0; i < Human.length; i++) {
                    //找出相同名称的行数
                    let doctorName = Human[i].ks
                    if (doctorMap[doctorName] !== undefined) {
                        doctorMap[doctorName].push(i);
                    } else {
                        doctorMap[doctorName] = [i];
                    }
                }
                let keyArr = [];
                for (let k in doctorMap) {
                    //取出key并倒序,防止正序插入会影响行下标
                    keyArr.unshift(k);
                }
                keyArr.forEach((ele, index) => {
                    let lastIndex = doctorMap[ele][doctorMap[ele].length - 1]; //找出相同名称最后一行插入合计数据
                    let obj = this.xj(Human, ele) //计算出小计行数据
                    Human.splice(lastIndex + 1, 0, obj) //插入
                })
            },
            // 小计行计算
            xj(data, name) {
                let obj = {
                    ks: name, //科室名字,用于合并单元格
                    doctor: '小计',
                    ghl: 0,
                    jzl: 0,
                    jz: 0,
                }
                data.forEach(item => {
                    // 科室相同的加起来
                    if (item.ks == name) {
                        obj.ghl += (item.ghl ? parseFloat(item.ghl) : 0)
                        obj.jzl += (item.jzl ? parseFloat(item.jzl) : 0)
                        obj.jz += (item.jz ? parseFloat(item.jz) : 0)
                    }
                })
                return obj
            },
            // 合计行计算
            hj(data) {
                let hj = {
                    ks: '合计',
                    doctor: '-',
                    ghl: 0,
                    jzl: 0,
                    jz: 0,
                }
                data.forEach(item => {
                    // 小计行加起来就是合计
                    if (item.doctor == '小计') {
                        hj.ghl += (item.ghl ? parseFloat(item.ghl) : 0)
                        hj.jzl += (item.jzl ? parseFloat(item.jzl) : 0)
                        hj.jz += (item.jz ? parseFloat(item.jz) : 0)
                    }
                })
                return hj
            },
            // 行底纹
            rowstyle({
                row,
                rowindex,
            }) {
                if (row.ks == '合计') {
                    return "background:#afdfe4;color:#34738f"
                }
                if (row.doctor == '小计') {

                    return "background:	#D9EDF7;color:#34738f;border-bottom:1px solid #409eff !important;"
                }
            },
            // 合并单元格
            objectSpanMethod({
                row,
                column,
                rowIndex,
                columnIndex
            }) {
                if (columnIndex === 0) {
                    const _row = this.spanArr[rowIndex];
                    const _col = _row > 0 ? 1 : 0;
                    return {
                        rowspan: _row,
                        colspan: _col
                    };
                }
            },
            // 计算要合并的单元格
            setdates() {
                let contactDot = 0;
                this.spanArr = []
                this.tableDatas.forEach((item, index) => {
                    item.index = index;
                    if (index === 0) {
                        this.spanArr.push(1);
                    } else {
                        // 根据相同科室来合并
                        if (item.ks === this.tableDatas[index - 1].ks) {
                            this.spanArr[contactDot] += 1;
                            this.spanArr.push(0);
                        } else {
                            contactDot = index;
                            this.spanArr.push(1);
                        }
                    }
                });
            },
        }
    })
</script>
<style scoped>

</style>

</html>
更多推荐

热点探测技术架构设计与实践

1.概述说到热点问题,首先我们先理解一下什么是热点?热点通常意义来说,是指在一段时间内,被广泛关注的物品或事件,例如微博热搜,热卖商品,热点新闻,明星直播等等,所以热点产生主要包含2个条件:1.有限时间,2流量高聚。而在互联网领域,热点又主要分为2大类:1.有预期的热点:比如在电商活动当中推出的爆款联名限量款的商品,又

软件机器人财务报表信息的采集和录入、抵押贷款信息查询助力银行贷款业务管理

随着科技的飞速发展,自动化的应用场景也越来越广泛。博为小帮软件机器人的出现,无疑为众多行业带来了巨大的转变,其中就包括银行贷款业务。软件机器人是一种可以模拟人类行为,自动化执行高重复性任务。银行业务中,许多重复性高、规则明确的工作,如企业客户财务报表信息的采集和录入、抵质押贷款的抵质押物信息查询等,正适合软件机器人的应

安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作

在玩机搞机过程中。有时候需要手动查看有些分区信息,或者备份分区的操作。那么今天以小米8为例解析下其中的操作步骤机型:小米8adb版本:https://developer.android.com/studio/releases/platform-tools机型芯片:高通骁龙845手机系统版本:安卓10机型界面:twrp机

嵌入式Linux驱动开发(I2C专题)(四)

编写APP直接访问EEPROM参考资料:Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24cxx.pdf1.硬件连接STM32MP157的I2C模块连

嵌入式学习 - 用电控制电

目录前言:1、继电器2、二极管3、三极管3.1特殊的三极管-mos管3.2npn类型三极管3.3pnp类型三极管3.4三极管的放大特性3.5mos管和三极管的区别前言:计算机的工作的核心原理:用电去控制电。所有的电子元件都有数据手册,不同型号的电子元件需要翻阅对应的数据手册。1、继电器电路图和原理如下:如图所示,当继电

CentOS7安装MySQL

文章目录前言一、MySQL5.71.1安装wget1.2下载&安装MySQL的rpm源1.3修改MySQL安装版本1.4下载并启动MySQL1.5开启MySQL远程连接用户二、MySQL8.0注意事项前言CentOS7的安装,采用的是yum的方式安装。yum方式安装,就类似在Windows下不停的下一步,下一步。根据官

灰度变换原理//test later

灰度变换原理图像灰度变换变换原理:通过变换函数T将原图像像素灰度值r映射为灰度值s:2、灰度反转2.1原理灰度反转:将图像亮暗对调,可以增强图像中暗色区域细节�=�(�)=�−1−�其中L为图像灰度级,0~255灰度图像的灰度级为256.2.2c++opencv代码#include<iostream>#include<

如何快速检测代理IP质量?

一直以来,IP代理都是出海跨境业务的刚需。质量好的IP代理,除了在跨境业务产生巨大作用,在SEO监控、爬虫抓取、市场研究等领域也发挥着很大的作用。但是,对于IP代理的质量检测是我们选择高标准IP代理的一句,我们一般都会建议在使用IP代理前,进行测试或检测。那么我们应该如何快速地检测代理IP的有效性与质量的好坏呢?接下来

第三章 关系数据库标准语言SQL

第三章关系数据库标准语言SQL3.1SQL概述3.1.1SQL的产生与发展3.1.2SQL的特点主要特点:综合统一集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)的功能于一体}数据操作统一可以独立完成数据库生命周期中的全部活动,包括以下一系列操作要求:定义和修改、删除关系模式,定义和删除视图,插

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

日志输出-查看 SQL:深入分析 MyBatis 执行过程

😀前言在现代软件开发中,数据库操作是不可或缺的一部分,而持久层框架的应用能够极大地简化这一过程。然而,当我们在开发MyBatis程序时,有时候需要深入了解程序底层实际执行的SQL语句,以便更好地分析和优化数据库操作。本文将探讨如何通过配置日志输出,在MyBatis中查看SQL语句的执行情况,以便更深入地了解其执行过程

热文推荐