1. 前言

这两天在工作中遇到这样一个需求:将某个Excel中的数据在页面上以表格形式展示出来,并且尽量保持数据层级与Excel中一致。在原始Excel文件中,对每一行相同的数据都进行了合并,使得数据比较有层次性,而在页面表格中,也需要将相同内容的单元格进行合并。博主手头的项目使用的UI框架是elemengUIelemengUI中的表格Table组件也提供了单元格合并的方法,并且给出了示例用法,但是在示例用法中是针对静态数据的,判断是写死的。而实际情况数据往往是动态的,我们需要去判断哪两个单元格内容相同然后动态的将它们合并。经过一阵折腾终于搞定了,这就来记录一下具体的实现方法,以供参考。

2. 效果图

话不多说,先看看效果图。

原始Excel文档内容结构:

最终页面展示效果:

3. 核心代码

首先是表格结构:

  1. <el-table
  2. :data="data"
  3. border
  4. fit
  5. stripe
  6. :span-method="cellMerge"
  7. highlight-current-row
  8. size="small"
  9. style="width: 100%;">
  10. <el-table-column prop="ruleId_1" label="指标编码" align="center" width="100"></el-table-column>
  11. <el-table-column prop="checkRange" label="检查范围" align="center" width="100"></el-table-column>
  12. <el-table-column prop="ruleId_2" label="指标编码" align="center" width="100"></el-table-column>
  13. <el-table-column prop="checkContent" label="检查内容" align="center" width="100"></el-table-column>
  14. <el-table-column prop="ruleId_3" label="指标编码" align="center" width="120"></el-table-column>
  15. <el-table-column prop="checkItem" label="检查项" align="center" width="300"></el-table-column>
  16. <el-table-column prop="ruleId_4" label="指标编码" align="center" width="200"></el-table-column>
  17. <el-table-column prop="checkPoint" label="检查要点" align="left" header-align="center"></el-table-column>
  18. </el-table>

数据data:

  1. export default {
  2. name:'levelProtect',
  3. data () {
  4. return {
  5. data:[], //表格数据
  6. spanArr: [],//二维数组,用于存放单元格合并规则
  7. position: 0,//用于存储相同项的开始index
  8. }
  9. }

方法methods:

  1. created() {
  2. this.getTableData()
  3. },
  4. methods:{
  5. // 从后端获取表格数据
  6. getTableData() {
  7. let para = {};
  8. axios({
  9. method: "post",
  10. url: "...",
  11. data: para
  12. })
  13. .then(res => {
  14. this.data = res.data || [];
  15. this.rowspan(0,'ruleId_1');
  16. this.rowspan(1,'checkRange');
  17. this.rowspan(2,'ruleId_2');
  18. this.rowspan(3,'checkContent');
  19. this.rowspan(4,'ruleId_3');
  20. this.rowspan(5,'checkItem');
  21. this.rowspan(6,'ruleId_4');
  22. this.rowspan(7,'checkPoint');
  23. })
  24. .catch(err => {});
  25. },
  26. rowspan(idx, prop) {
  27. this.unit.spanArr[idx] = [];
  28. this.unit.position = 0;
  29. this.unit.data.forEach((item,index) => {
  30. if( index === 0){
  31. this.unit.spanArr[idx].push(1);
  32. this.unit.position = 0;
  33. }else{
  34. if(this.unit.data[index][prop] === this.unit.data[index-1][prop] ){
  35. this.unit.spanArr[idx][this.unit.position] += 1;//有相同项
  36. this.unit.spanArr[idx].push(0); // 名称相同后往数组里面加一项0
  37. }else{
  38. this.unit.spanArr[idx].push(1);//同列的前后两行单元格不相同
  39. this.unit.position = index;
  40. }
  41. }
  42. })
  43. },
  44. //表格单元格合并
  45. cellMerge({ row, column, rowIndex, columnIndex }) {
  46. for(let i = 0; i<this.spanArr.length; i++) {
  47. if(columnIndex === i){
  48. const _row = this.unit.spanArr[i][rowIndex];
  49. const _col = _row>0 ? 1 : 0;
  50. // console.log('第'+rowIndex+'行','第'+i+'列','rowspan:'+_row,'colspan:'+_col)
  51. return {
  52. rowspan: _row,
  53. colspan: _col
  54. }
  55. }
  56. }
  57. }
  58. }

代码说明:

  • 在组件加载时,调用getTableData方法从后端拉取表格数据;
  • 得到表格数据后,我们把需要相同内容单元格合并的列通过调用this.rowspan(0,'ruleId_1');,得到的spanArr二维数组表示该列所需要合并的行数;
  • cellMerge就是传给el-table合并行或列的计算方法

如果还是没有看明白,那就直接运行demo看看吧,demo猛戳这里!!!

(完)

如何让elemengUI中的表格组件相同内容的单元格自动合并的更多相关文章

  1. 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。

    前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...

  2. 使用VUE组件创建SpreadJS自定义单元格(二)

    在上篇中,我们介绍了如何通过设置runtimeCompiler为true,在Vue中实现了动态创建电子表格组件.想了解具体内容可看点击查看使用VUE组件创建SpreadJS自定义单元格(一). 但是在 ...

  3. [Xcode 实际操作]五、使用表格-(5)设置UITableView的单元格背景颜色

    目录:[Swift]Xcode实际操作 本文将演示单元格背景颜色的设置 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加两个协 ...

  4. [Xcode 实际操作]五、使用表格-(11)调整UITableView的单元格顺序

    目录:[Swift]Xcode实际操作 本文将演示如何调整单元格在表格中的位置. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先 ...

  5. phpspreadsheet 中文文档(一) 访问单元格

    2019年10月11日11:45:09 访问单元格 访问电子表格中的单元格应该非常简单.本主题列出了一些访问单元的选项. 通过坐标设置单元格值 可以使用工作表的setCellValue()方法来按坐标 ...

  6. 使用VUE组件创建SpreadJS自定义单元格(一)

    作为近五年都冲在热门框架排行榜首的Vue,大家一定会学到的一部分就是组件的使用.前端开发的模块化,可以让代码逻辑更加简单清晰,项目的扩展性大大加强.对于Vue而言,模块化的体现集中在组件之上,以组件为 ...

  7. jQuery实现HTML表格单元格的合并功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?

    https://zhidao.baidu.com/question/230715654.html 假设单元格A1值是8(该值由函数计算得出),我要在单元格B1中引用A1的值,但只是作为B1单元格内容中 ...

  9. excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容

    1.substitute(需要执行替换操作的单元格,需要替换的字符,替换后的字符,有多个需要替换的字符可以指定替换的第几个) 例如:aab--substitute("aab",&q ...

随机推荐

  1. 队列 & 栈---概述

    队列 是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作 ...

  2. (八十五)c#Winform自定义控件-引用区块

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. springboot项目目录结构

    idea新建springboot项目 按默认下一步至完成,默认目录结构如下 pom.xml文件内容如下 <?xml version="1.0" encoding=" ...

  4. MySQL 配置环境

    MySQL 显示 Can't connect to MySQL server on 'localhost' (10061)怎么解决 在cmd中配置启动sql后,找不到密码.然后怎么也没办法弄,不知道怎 ...

  5. java之ThreadLocal详解

    一.ThreadLocal简介 ThreadLocal是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问,通常是类中的private static字段. 我们知道有时候一个对象的变量 ...

  6. tf.split

    tf.split(dimension, num_split, input):dimension的意思就是输入张量的哪一个维度,如果是0就表示对第0维度进行切割.num_split就是切割的数量,如果是 ...

  7. [NOIp2011] luogu P1313 计算系数

    继续水博客,待会回去上术学. 题目描述 给定一个多项式 (by+ax)k(by+ax)^k(by+ax)k ,请求出多项式展开后 xn×ymx^n \times y^mxn×ym 项的系数. Solu ...

  8. [BZOJ1116] CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1311  Solved: 709[Submit][Status] ...

  9. [USACO17FEB]Why Did the Cow Cross the Road III S

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

  10. 分布式FastDFS集群部署

    FastDFS FastDFS的作者余庆在其 GitHub 上是这样描述的:"FastDFS is an open source high performance distributed f ...