位置: IT常识 - 正文

【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码(elementui ts)

编辑:rootadmin
【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码 el-table合并单元格1.固定合并官方挺提供的合并具体某行列的方法:el-table合并行或列通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。 该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspan和colspan的对象。<template> <div> <el-table :data="tableData" :span-method="arraySpanMethod" border style="width: 100%"> <el-table-column prop="id" label="ID" width="180"> </el-table-column> <el-table-column prop="name" label="姓名"> </el-table-column> <el-table-column prop="amount1" sortable label="数值 1"> </el-table-column> <el-table-column prop="amount2" sortable label="数值 2"> </el-table-column> <el-table-column prop="amount3" sortable label="数值 3"> </el-table-column> </el-table> <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%; margin-top: 20px"> <el-table-column prop="id" label="ID" width="180"> </el-table-column> <el-table-column prop="name" label="姓名"> </el-table-column> <el-table-column prop="amount1" label="数值 1(元)"> </el-table-column> <el-table-column prop="amount2" label="数值 2(元)"> </el-table-column> <el-table-column prop="amount3" label="数值 3(元)"> </el-table-column> </el-table> </div></template><script> export default { data() { return { tableData: [{ id: '12987122', name: '王小虎', amount1: '234', amount2: '3.2', amount3: 10 }, { id: '12987123', name: '王小虎', amount1: '165', amount2: '4.43', amount3: 12 }, { id: '12987124', name: '王小虎', amount1: '324', amount2: '1.9', amount3: 9 }, { id: '12987125', name: '王小虎', amount1: '621', amount2: '2.2', amount3: 17 }, { id: '12987126', name: '王小虎', amount1: '539', amount2: '4.1', amount3: 15 }] }; }, methods: { arraySpanMethod({ row, column, rowIndex, columnIndex }) { if (rowIndex % 2 === 0) { if (columnIndex === 0) { return [1, 2]; } else if (columnIndex === 1) { return [0, 0]; } } }, objectSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { if (rowIndex % 2 === 0) { return { rowspan: 2, colspan: 1 }; } else { return { rowspan: 0, colspan: 0 }; } } } } };</script>

推荐整理分享【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码(elementui ts),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:elementuiicon,element ui怎么样,elemental ui,elementplus ui,element ui el-dialog,element ui el-dialog,element ui el-dialog,element_ui,内容如对您有帮助,希望把文章链接给更多的朋友!

运行效果:

缺点:这种只适合写死的数据和固定的表格行列,无法动态判断单元格数据是否相等再合并;2. 动态合并相同数据单元格(所有列)可以对所有相同数据的列,进行动态合并此方法适合需要合并所有的相同数据的单元格<template> <div> <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 { // 存放所有的表头 一定要与tableData一致 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: "80", }, { School: "第一小学", Grade: "1年级", Class: "3班", Name: "王五", Chinese: "79", Math: "100", English: "80", }, // 二年级 { School: "第一小学", Grade: "2年级", Class: "1班", Name: "赵六", Chinese: "95", Math: "100", English: "80", }, { School: "第一小学", Grade: "2年级", Class: "2班", Name: "钱八", Chinese: "98", Math: "85", English: "80", }, { School: "第一小学", Grade: "2年级", Class: "3班", Name: "陈九", Chinese: "79", Math: "100", English: "80", }, // 三年级 { School: "第一小学", Grade: "3年级", Class: "1班", Name: "黄十", Chinese: "91", Math: "88", English: "80", }, { School: "第一小学", Grade: "3年级", Class: "2班", Name: "魏一", Chinese: "90", Math: "86", English: "87", }, { School: "第一小学", Grade: "3年级", Class: "3班", Name: "杨二", Chinese: "79", Math: "99", English: "80", }, ], }; }, 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++) { // 当前和上一次的一样 // 1. 合并所有列的相同数据单元格 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, // 合并几列,我这里只是跨行合并,不跨列合并,所以用的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]; }, }, mounted() { this.getSpanArr(); },};</script><style lang="scss" scoped></style>

效果:

【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码(elementui ts)

我们可以看到,所有列,只要数据相同的单元格都被合并了,包括我不想合并的单元格,这时候就要指定合并的列了

3. 动态合并相同数据单元格(指定列)只需要加个if判断即可指定要合并哪些列// 这里只放了部分代码,除了加了个if,其他代码和上面的一样 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" || this.colFields[j] == "Class" ) { // 指定合并哪些列 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, }; } } } } }

效果: 这样就只合并了我们指定的那几列了

4. 动态合并相同数据单元格(指定列+合并条件)

有时候我们会遇到不想合并的单元格,比如下面这种情况: 按常理来说,不同小学的数据应该是不做合并才对,正确是这种: 这时候就需要加上一些自定义的合并条件了:

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" || this.colFields[j] == "Class" ) { // 指定合并哪些列 if ( this.tableData[row]["School"] !== this.tableData[row - 1]["School"] ) { // 哪些不合并:School不一样的,不合并 this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; } else 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, }; } } } } } // console.log(this.spanArr); },

这时候再看,就是我们想要的效果了

完整代码

最后附完整代码:

<template> <div> <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 { // 存放所有的表头 一定要与tableData一致 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: "1班", Name: "张伟", Chinese: "90", Math: "99", English: "89", }, { School: "第一小学", Grade: "1年级", Class: "2班", Name: "李四", Chinese: "90", Math: "85", English: "80", }, { School: "第一小学", Grade: "1年级", Class: "3班", Name: "王五", Chinese: "79", Math: "100", English: "80", }, // 二年级 { School: "第一小学", Grade: "2年级", Class: "1班", Name: "赵六", Chinese: "95", Math: "100", English: "80", }, { School: "第一小学", Grade: "2年级", Class: "2班", Name: "钱八", Chinese: "98", Math: "85", English: "80", }, { School: "第一小学", Grade: "2年级", Class: "3班", Name: "陈九", Chinese: "79", Math: "100", English: "100", }, // 三年级 { School: "第一小学", Grade: "3年级", Class: "1班", Name: "黄十", Chinese: "91", Math: "88", English: "80", }, { School: "第一小学", Grade: "3年级", Class: "2班", Name: "魏一", Chinese: "90", Math: "86", English: "87", }, { School: "第一小学", Grade: "3年级", Class: "3班", Name: "杨二", Chinese: "79", Math: "99", English: "80", }, // 第二小学 { School: "第二小学", Grade: "3年级", Class: "3班", Name: "袁零", Chinese: "79", Math: "99", English: "80", }, ], }; }, 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" || this.colFields[j] == "Class" ) { // 指定合并哪些列 if ( this.tableData[row]["School"] !== this.tableData[row - 1]["School"] ) { // 哪些不合并:School不一样的,不合并 this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; } else 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]; }, }, mounted() { this.getSpanArr(); },};</script><style lang="scss" scoped></style>

参考:https://blog.csdn.net/u010735120/article/details/122184493

本文链接地址:https://www.jiuchutong.com/zhishi/284015.html 转载请保留说明!

上一篇:软件工程毕设题目大全 40个计算机毕业设计项目分享【含源码+论文】(软件工程毕设题目冷门)

下一篇:双栏Latex模板插入多个图片的各种排布(latex双栏图片)

  • vivoz5x怎么关闭hd高清通话(vivoz5x怎么关闭变形器)

    vivoz5x怎么关闭hd高清通话(vivoz5x怎么关闭变形器)

  • 华为mate30pro充电显示怎么调(华为mate30pro充电器多少瓦)

    华为mate30pro充电显示怎么调(华为mate30pro充电器多少瓦)

  • 华为畅享9没有录屏(华为畅享9没有声音怎么处理)

    华为畅享9没有录屏(华为畅享9没有声音怎么处理)

  • 抖音里面的喜欢是怎么来的(抖音里面的喜欢列表怎么删除)

    抖音里面的喜欢是怎么来的(抖音里面的喜欢列表怎么删除)

  • qq怎么设置忙碌(qq怎么设置忙碌自己回复消息)

    qq怎么设置忙碌(qq怎么设置忙碌自己回复消息)

  • 央视直播间在哪里看(央视频直播在哪看)

    央视直播间在哪里看(央视频直播在哪看)

  • 4k电影多少G(4k电影多少流量)

    4k电影多少G(4k电影多少流量)

  • msbuild是什么文件夹(msbuild什么文件)

    msbuild是什么文件夹(msbuild什么文件)

  • 联想笔记本屏幕倒过来了怎么办(联想笔记本屏幕突然变暗了怎么恢复)

    联想笔记本屏幕倒过来了怎么办(联想笔记本屏幕突然变暗了怎么恢复)

  • 淘宝详情页能一次全换吗(淘宝详情页一屏是多高)

    淘宝详情页能一次全换吗(淘宝详情页一屏是多高)

  • 微信语音通话久了中断(微信语音通话久了会断吗)

    微信语音通话久了中断(微信语音通话久了会断吗)

  • 关闭语音模式(关闭语音模式钉钉)

    关闭语音模式(关闭语音模式钉钉)

  • 红米notepro屏幕什么材质(红米notePro屏幕更换教程)

    红米notepro屏幕什么材质(红米notePro屏幕更换教程)

  • qq手机2g在线什么意思(qq手机2g在线可以收到消息吗)

    qq手机2g在线什么意思(qq手机2g在线可以收到消息吗)

  • g2020配什么主板(英特尔x79主板多少钱)

    g2020配什么主板(英特尔x79主板多少钱)

  • 快手动态添加什么意思(快手设置动态)

    快手动态添加什么意思(快手设置动态)

  • gprs和gps定位区别(gprs与gps)

    gprs和gps定位区别(gprs与gps)

  • 三线表格如何制作方法(三线表格如何制作)

    三线表格如何制作方法(三线表格如何制作)

  • 淘宝直播怎么改名字(淘宝直播怎么改预告时间)

    淘宝直播怎么改名字(淘宝直播怎么改预告时间)

  • 计算机硬件包含哪几个部分(计算机硬件包含几个部分)

    计算机硬件包含哪几个部分(计算机硬件包含几个部分)

  • 华为全局搜索怎么关闭(华为全局搜索怎么开启)

    华为全局搜索怎么关闭(华为全局搜索怎么开启)

  • 鸿蒙系统小艺怎么改声音?鸿蒙系统小艺更改声音教程(鸿蒙系统小艺怎么改声音)

    鸿蒙系统小艺怎么改声音?鸿蒙系统小艺更改声音教程(鸿蒙系统小艺怎么改声音)

  • 一对深红玫瑰鹦鹉幼鸟,维多利亚州 (© Naser Alhujailan/plainpicture/Minden Pictures)(深红玫瑰鹦鹉多钱一个)

    一对深红玫瑰鹦鹉幼鸟,维多利亚州 (© Naser Alhujailan/plainpicture/Minden Pictures)(深红玫瑰鹦鹉多钱一个)

  • 【机器学习面试总结】————(一)

    【机器学习面试总结】————(一)

  • 财税证与会计证区别
  • 小规模纳税人加油发票可以抵扣吗
  • 未认证待抵扣进项税重分类
  • 合同取得成本如何结转
  • 应付账款贷方怎么调整
  • 房地产涉及的税种和税率
  • 付款人常驻国家(地区)代码及名称RU
  • 非盈利组织是两套账吗?
  • 企业在什么情况下辞退员工不需要补偿
  • 资产重组账务处理 会计视野
  • 国有企业无偿划转资产需要交税吗?
  • 旅行社差额征收怎么做账
  • 库存商品期末计量
  • 个人投资借款长期不还要缴纳个人所得税吗?
  • 出售无形资产是收入吗
  • 税务局申请发票
  • 补去年的税款怎么做账
  • 金三打印客户端插件如何下载?
  • 增值税返还收入冲减进项税
  • 报销单里报销内容可以写送客户烟吗
  • 初级备考需要多长时间
  • 进项税额大于销项税额怎么办
  • 现金净流量正常值
  • 应发工资包含
  • 给外国教授发邮件最后一句
  • 公允价值变动借方是增还是减
  • 网页显示不全怎么回事
  • 年度企业所得税申报表在哪里打印
  • 暂估成本后发票怎么入账
  • windows10激活密钥免费2023
  • win10如何禁止
  • 交易性金融资产的入账价值
  • 高新企业政府补贴政策
  • 高新技术企业产品是什么意思
  • 外购商品转为自用洧费税计算
  • 个人从事生产经营
  • php获取当天是星期几
  • 工商年报中营业费用包括
  • 汇算清缴的表在哪里
  • php合并字符串函数
  • 研发费用加计扣除75%还是100%
  • 物流公司的会计好做吗
  • 企业收入总额的计算公式
  • 进项税额转出月底需要结转吗
  • 织梦官方网站
  • 年终企业所得税怎么结转
  • 无形资产商标设计图片
  • 收益相关的政府补助账务处理
  • 工会经费申报的依据
  • 新入职员工什么时候发工资
  • 期权权利金的计算公式
  • 所得税减免的会计科目
  • 购买理财计入现金流量表什么科目
  • 年收益率与年化利率是一样?
  • 固定资产后续支出计入的科目
  • 付款金额与发票金额不一致能入账吗?
  • 全资子公司并入母公司
  • 融资租赁固定资产利息的账务处理实例
  • 企业收到的政府补助属于
  • 现金流动负债比率越大越好吗
  • 什么是建账?建账的基本程序是什么?
  • 工业企业销售商品分录
  • ubuntu的终端在哪
  • win8无线网络受限 重连又好了
  • win7操作技巧
  • Linux系统怎么设置中文输入法
  • 【Cocso2d-x Lua笔记五】quick中的display
  • unity怎么念
  • dos脚本 菜鸟教程
  • 如何用python进行数据处理
  • android 生成图片
  • texture packer工具
  • linux shell有什么用
  • jquery的css样式
  • shell 自定义函数
  • oracle批处理语句
  • javascript几种类型
  • 残疾人就业有哪些选择
  • 党员逝世可否盖党旗
  • 税务局诉讼
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设