el-table实现指定列合并

2023-11-10

table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspancolspan的对象

代码

<template>
  <div id="app">
     <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      :header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
    >
      <el-table-column prop="School" label="学校" align="center">
      </el-table-column>
      <el-table-column prop="Grade" label="年级" align="center" />
      <el-table-column prop="Class" label="班级" align="center" />
      <el-table-column prop="Name" label="姓名" align="center" />
      <el-table-column prop="Chinese" label="语文" align="center" />
      <el-table-column prop="Math" label="数学" align="center" />
      <el-table-column prop="English" label="英语" align="center" />
    </el-table>
  </div>
</template>
<script>  
  export default {
    data() {
      return {
            colFields: [
        "School",
        "Grade",
        "Class",
        "Name",
        "Chinese",
        "Math",
        "English",
      ],
      spanArr: [], //存储合并单元格的开始位置
      // 表格数据
      tableData: [
        // 一年级
        {
          School: "新华小学",
          Grade: "1年级",
          Class: "1班",
          Name: "张三",
          Chinese: "90",
          Math: "100",
          English: "80",
        },
        {
          School: "新华小学",
          Grade: "1年级",
          Class: "2班",
          Name: "李四",
          Chinese: "90",
          Math: "85",
          English: "81",
        },
        {
          School: "新华小学",
          Grade: "1年级",
          Class: "3班",
          Name: "王五",
          Chinese: "79",
          Math: "100",
          English: "86 ",
        },
        // 二年级
        {
          School: "新华小学",
          Grade: "2年级",
          Class: "1班",
          Name: "赵六",
          Chinese: "95",
          Math: "120",
          English: "82",
        },
        {
          School: "新华小学",
          Grade: "2年级",
          Class: "2班",
          Name: "钱八",
          Chinese: "98",
          Math: "85",
          English: "83",
        },
        {
          School: "新华小学",
          Grade: "2年级",
          Class: "3班",
          Name: "陈九",
          Chinese: "79",
          Math: "100",
          English: "84",
        },
        // 三年级
        {
          School: "新华小学",
          Grade: "3年级",
          Class: "1班",
          Name: "黄十",
          Chinese: "91",
          Math: "88",
          English: "85",
        },
        {
          School: "新华小学",
          Grade: "3年级",
          Class: "2班",
          Name: "魏一",
          Chinese: "90",
          Math: "86",
          English: "87",
        },
        {
          School: "新华小学",
          Grade: "3年级",
          Class: "3班",
          Name: "杨二",
          Chinese: "79",
          Math: "99",
          English: "85",
        },
      ],

    
      };

    },
   mounted() {
    this.getSpanArr();
  },
    methods: {
    /**
     * 分析每一列,找出相同的
     * @param data
     */
    getSpanArr() {
      for (let i = 0; i < this.tableData.length; i++) {
        let row = i;
        // let col = i % this.colCount;
        if (row === 0) {
          // i 表示行 j表示列
          for (let j = 0; j < this.colFields.length; j++) {
            this.spanArr[i * this.colFields.length + j] = {
              rowspan: 1,
              colspan: 1,
            };
          }
        } else {
          for (let j = 0; j < this.colFields.length; j++) {
            // 当前和上一次的一样
            //  合并所有列的相同数据单元格
            if (
              this.colFields[j] == "School" ||
              this.colFields[j] == "Grade"
            ) { // 指定合并哪些列
              if (
                this.tableData[row][this.colFields[j]] ===
                this.tableData[row - 1][this.colFields[j]]
              ) {
                let beforeItem =
                  this.spanArr[(row - 1) * this.colFields.length + j];
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1 + beforeItem.rowspan,
                  colspan: 1,
                };
                beforeItem.rowspan = 0;
                beforeItem.colspan = 0;
              } else {
                // rowspan 和 colspan 都为1表格此单元格不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              }
            }
          }
        }
      }
      // 对数据进行倒序
      let stack = [];
      for (let i = 0; i < this.colFields.length; i++) {
        for (let j = 0; j < this.tableData.length; j++) {
          // console.log("i=" + i + " j=" + j);
          // i 表示列 j表示行
          if (j === 0) {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            }
          } else {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            } else {
              stack.push(this.spanArr[j * this.colFields.length + i]);
              while (stack.length > 0) {
                let pop = stack.pop();
                let len = stack.length;
                this.spanArr[(j - len) * this.colFields.length + i] = pop;
              }
            }
          }
        }
      }
      // console.log(this.spanArr);
    
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
      return this.spanArr[rowIndex * this.colFields.length + columnIndex];
    }
    }
  };
</script>
<style lang="less">

</style>

 这样就可以实现学校和年级这两列相同数据的合并了

效果

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

el-table实现指定列合并 的相关文章

  • 在 ExpressJS 中通过管道传送远程文件

    我想读取远程图像并显示它 我可以保存文件 但无法正确显示代码 理想情况下 我只想直接传递文件而不进行处理 不确定是否需要 tmp 文件步骤 此代码不显示任何内容 没有错误 我也尝试了 res pipe response var url ht
  • Javascript Firefox - 如果 @import 存在于样式表中,则无法查询 cssRules - bug 或预期行为?

    如果 import 存在于 css 样式表中 我无法查询 cssRules 是否符合网络标准 或者知道 Firefox 的限制 注意 我正在从同一域导入 css 文件 var style rules document styleSheets
  • 为具有可变内容的内联块元素提供相同的高度?

    我有 4 个宽度固定但内容可变的内联块元素 并且我希望所有这些元素具有相同的高度 最大元素的高度 请参见这个jsfiddle http jsfiddle net kKZXj 我应该如何实现这个目标 如果仅使用 css 无法做到这一点 那么使
  • 表单未使用 AJAX 提交

    再次更新 如果有人关心的话 我之前发布的解决方案由于某种原因停止工作 我在 ajax 请求中包含了 beforeSend 并将验证表单的 js 部分粘贴到其中 现在就像一个魅力 form on submit function e e pre
  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • KineticJS - 将舞台缩放到视口

    我正在努力将默认分辨率设置为 1366x756 我会根据视口来放大和缩小它 类似于此处显示的示例 http blogs msdn com b davrous archive 2012 04 06 modernizing your html5
  • 通过单击字段启用非活动字段

    是否可以有一组非活动字段 如果单击其中一个字段 则某些字段将变为必填字段并运行某些代码段 举例来说 您显示了三个字段
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 如何滚动到 jQuery Mobile 中的页面元素?

    我有一个很长的 jQuery 移动页面 并且想在页面加载后滚动到该页面中间的元素 到目前为止 我已经尝试了一些事情 最成功的是 jQuery document bind mobileinit function var target if t
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到
  • Backbone-relational 无法实例化两个 RelationalModel 对象

    我正在尝试实现 BackboneRelational 并不断获得 无法实例化多个 Backbone RelationalModel 每种类型都有相同的 ID class App Models User extends Backbone Re
  • 将服务连接到现有的流星帐户

    我正在设置一个流星应用程序 其中涉及使用用户名和密码进行注册 然后希望将该帐户与 Facebook 和 Twitter 连接起来 我只需使用帐户包即可轻松启动并运行第一部分 但是当我有一个登录用户调用 Meteor loginWithFac
  • 检查 href 中是否存在 jQuery 中的查询字符串

    我目前有一段 jQuery 用于附加带有一些位置信息的 URL jQuery a attr href function return this href location 123 abc 我的问题是大多数链接都有一个 其中使用上面的 就可以
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • 如何检查摘要周期是否稳定(又名“Angular 完成编译了吗?”)

    tl dr 最初的问题是 如何在每个摘要周期触发回调 但潜在的问题更有趣 因为这回答了两个问题 所以我继续修改了标题 Context 在解决了所有依赖项 nginclude API 调用等之后 我试图控制 Angular 何时完成 HTML
  • 在javascript中定义Date.parse的格式[重复]

    这个问题在这里已经有答案了 我正在使用 Date parse 将字符串转换为 JavaScript 中的日期 但是 如果字符串看起来像 10 11 2016 它会被解释为 2016 年 10 月 11 日 我需要将其解释为 2016 年 1
  • 条件顺序仅在 init AngularJS 上执行

    如何在视图初始化时仅运行 orderBy 过滤器一次 我不希望我的列表在运行时被重新排序 li li 使用 orderBy 作为控制器中的过滤器 app controller DemoCtrl scope filter function s
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy

随机推荐

  • 【MQTT】MQTT协议学习

    文章目录 MQTT协议 简述 特点 MQTT消息的QoS 服务质量 MQTT支持三种QoS等级 协议实现方式 MQTT协议数据包 控制报文 结构 MQTT固定头 MQTT数据包类型 标识位 剩余长度 Remaining Length MQT
  • Sqlserver 监控使用磁盘空间情况

    最近遇到一个小问题 为了保存以往的一些数据 间了大量临时表 导致SQLserver 数据增长过快 不得不想个办法监控磁盘空间使用情况 网上一般有几种办法 一是使用 dm os volume stats函数 缺点是 无法获取非数据库所在的磁盘
  • Service Bus Namespace 和 Access Control

    Service Bus Namespace 和 Access Control Service Bus Namespace简述 https yourapp servicebus windows net foo bar baz 就是一个name
  • 【必看】时序逻辑仿真成组合逻辑?你知道原因吗?

    对于初学者 一般会遇到这种情况 明明写的时序逻辑 结果仿真结果却是组合逻辑 然后看遍设计代码 始终找不到原因 交流群 知乎这种问题随处可见 但不要怀疑软件问题 modelsim这些专用软件基本不会遇见软件自身问题 原因其实很简单 因为多数人
  • 常用内存数据库介绍(四)

    4 5 H2 Database h2是Thomas Mueller提供的一个开源的 纯java实现的关系数据库 官方网站 http www h2database com html main html 它的主要特性是 非常速的数据库引擎 开源
  • 《算法图解》总结第 7 章:狄克斯特拉算法

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快
  • mac safari无法打开网页_Safari浏览器无法打开网页,因为您的iphone尚未接入互联网...

    原因如下 1 移动数据没打开 如果苹果手机出现游览器无法打开网页 我们专首先要查看手机上面网络属数据是否开启 如果忘记开启网络数据的话 那么没有网络也就无法打开访问网页 这个时候 打开系统设置将蜂窝移动数据按钮打开 即可解决这个问题 2 检
  • FastCGI sent in stderr: “Primary script unknown“ while reading response header from upstream问题解决

    error 1439 1439 5 FastCGI sent in stderr Primary script unknown while reading response header from upstream php对接nginx的配
  • wifi 概念

    wifi 的一些概念 转载 http blog csdn net eager7 article details 8117600 python view plain copy 1 什么是WIFI Wi Fi 原先是无线保真的缩写 Wi Fi
  • html中哪些是行内元素,html行内元素有哪些

    html行内元素有 a b u span img input strong select sub sup label em button textarea tt var samp br cite code font strike等等 本教程
  • layui文件上传后台(带自定参数)

    记录layui文件上传方法 前端页面直接看layui文件上传相关文档就行 主要是记录后端Java接收上传流并保存的方法 layui文档 https www layui com doc modules upload html 因为该方法使用M
  • [BSidesSF2019]goodluks

    BSidesSF2019 goodluks 考点 题解过程 flag 考点 1 EFF 骰子密码 2 Linux删除的文件恢复 3 LUKS加密 题解过程 开局给了一张图片和一个img的文件 首先使用查看镜像的文件内容 是一个MBR的启动项
  • matlab非线性规划

    1 非线性规划matlab函数 非线性规划函数的约束函数和目标函数至少有一个是非线性函数 而对比于线性规划的区别也就一眼识别了 MATLAB中用于求解非线性规划的函数为fmincon 其调用格式如下 x fmincon f x0 A b x
  • java调用webservice接口 几种方法

    webservice的 发布一般都是使用WSDL web service descriptive language 文件的样式来发布的 在WSDL文件里面 包含这个webservice暴露在外面可供使用的接口 今天搜索到了非常好的 webs
  • python数据预处理之缺失值的各种填补方式

    如果你觉得文字看着枯燥 可以看配套讲解视频 讲解视频 对于数据挖掘的缺失值的处理 应该是在数据预处理阶段应该首先完成的事 缺失值的处理一般情况下有三种方式 1 删掉缺失值数据 2 不对其进行处理 3 利用插补法对数据进行补充 第一种方式是极
  • 修改 bootargs 方式增加分区(mtd分区和blkdevparts分区)

    1 Linux内核设置分区的两种方式 1 1 内核代码中写死 在内核的平台代码中写死 然后在初始化NandFlash的时候设置 1 2 uboot通过bootargs传递分区表 1 u boot将分区信息 形如 mtdparts xxx b
  • 机器学习之逻辑回归,代码实现(附带sklearn代码,小白版)

    文章目录 前言 一 逻辑回归能够解决什么 二 公式 三 激活函数 四 如何求得w 六 逻辑回归代码实现 五 sklearn demo 总结 前言 虽然名字带有回归 但实际上是一个常用的二分类算法 并且在预测的时候能够提供预测类别的概率 一
  • antd中Form.useForm()使用方式

    这里写自定义目录标题 onRow 表单Form useForm onRow table table record 点击后获取的数据对象 onRow record gt return event获取当前列元素节点 可用 event targe
  • 聚类算法4——DBSCAN密度聚类(算法步骤及matlab代码)

    看了西关书的聚类算法 算法原理很容易明白 接下来就是整理成自己的理解思路 然后一步一步来实现算法 那么就来做吧 DensityClustering算法 概念 从样本密度的角度考察样本之间的可连接性 样本分布的紧密程度刻画聚类结构 术语 核心
  • el-table实现指定列合并

    table传入span method方法可以实现合并行或列 方法的参数是一个对象 里面包含当前行row 当前列column 当前行号rowIndex 当前列号columnIndex四个属性 该函数可以返回一个包含两个元素的数组 第一个元素代