Table表格合并

article/2025/9/12 20:33:32

vue+elementUI 中的 Table 表格的合并功能,可配置,使用方便。

1、合并前后效果图

合并前
合并后

2、代码实现

<template><div class="hello">{{msg}}<div><el-table:data="tableData":span-method="arraySpanMethod"borderstyle="width: 1000px;margin:30px auto;"height="550"><el-table-columnv-for="(item, index) in tableTitleData":key="index":prop="item.prop":label="item.label":min-width="item.minWidth"><template slot-scope="scope"><span>{{scope.row[item.prop]}}</span></template></el-table-column></el-table></div></div>
</template><script>import { tableTitleData, tableData } from './js/options';export default {name: 'mergeTable',data() {return {msg: '表格合并',tableData,tableTitleData};},methods: {// ====================================== 合并多列单元格逻辑arraySpanMethod({ row, column, rowIndex, columnIndex }) {// 合并单元格/*** desc 该方法会触发n次,n是表格data的length*表头data的length;* @param  {String} row         [ 当前遍历到的行数据 (后台接口返回的) ]* @param  {Object} column      [ 当前遍历到的列数据 (elemen表格对象内置的) ]* @param  {Number} rowIndex    [ 当前遍历到的行下标 ]* @param  {Number} columnIndex [ 当前遍历到的列下标 ]* @return {Object} 包含合并的行和列信息*///  ================================================================ 分割线if (!(this.realTitleData || []).length) {this.realTitleData = []; // 这个数组是带children的表头data展开children后的数组this.tableTitleData.forEach(val => {// 展开存在children的titleDataif (val.children && (val.children || []).length) {val.children.forEach(child => {this.realTitleData.push(child);});} else {this.realTitleData.push(val);}});}if (!(this.mergeTabelArr || []).length) {// 只运行一次,获得要合并的信息数组const keywords = ['areaName']; // (这个数组要根据不同表格来配置!!!) 一些prop名的集合,这些porp名代表的字段 在每个做过合并的行数据集合里 它的的值 都是唯一的(比如区域、片区、中心名称之类的)。这个集合用于确保合并信息的唯一性,确保表格不会错乱this.mergeTabelArr = this.getMergeTabelArr(this.tableData,this.realTitleData,keywords,[0, 1]);// console.log('完整的合并表格的信息集合', this.mergeTabelArr);}// if (columnIndex > 0) { // 除掉序号那一列(这里用于自定义过滤某列),都要合并const _rowArr = (this.mergeTabelArr.find(n => n.key === column.property) || {}).connect; // connect数组if (_rowArr) {const _row = _rowArr[rowIndex];return {rowspan: _row, // 0代表删除这列,1代表展示这列,>1代表合并列colspan: _row > 0 ? 1 : 0 // 0代表删除这列,1代表展示这列,>1代表合并列};}// }},getMergeTabelArr(data = [],titleData = [],keywords = [],colIndexs = []) {// 获取合并表格的信息集合/*** desc 该方法为最终组合‘合并表格的信息集合’的方法* @param  {Array}  data                   [ 表格的data ]* @param  {Array}  titleData              [ 表格的表头的data ]* @param  {Array}  keywords  ['1','a'...] [ 一些prop名的集合,这些porp名代表的字段 在每个做过合并的行数据集合里 它的的值 都是唯一的(比如区域、片区、中心名称之类的)。这个集合用于确保合并信息的唯一性,确保表格不会错乱 ]* @param  {Array}  colIndexs [0,1,-2,...] [ 合并规则数组,这个数组里所有的负数值代表不合并的列的下标,正数代表合并的列的下标 ]* @return {Array} arr  示例:* [*   {*     key: 'nextSite', // 对应列的prop名*     connect: [2, 0, 2, 0, 1]  // connect数组*   },*   ...* ];*///  ================================================================ 分割线const columnArr = colIndexs.length? titleData.filter((n, i) => {const index = colIndexs.findIndex(realV => {if (realV < 0) return false;const v = Math.abs(realV);return i === v;});return index !== -1;}): []; // 按传递进来的规则过滤this.oldMergeTabel = []; // 给this添加oldMergeTabel属性,防止后面报错const arr = columnArr.map(v1 => {const obj = this.getConnectArr(data,v1.prop,keywords,this.oldMergeTabel);this.oldMergeTabel = obj.connect; // 保存前一条的connect数组信息return obj;});return arr;},getConnectArr(data, key, keywords, oldMergeTabel) {// 获取connect数组/*** desc 该方法会触发n次,n是过滤后的,要合并的表头data的length;* @param  {Array}  data          [ 表格的data数据 ]* @param  {String} key           [ 要合并的表头的prop名 ]* @param  {Array}  keywords      [ 一些prop名的集合,这些porp名代表的字段 在每个做过合并的行数据集合里 它的的值 都是唯一的(比如区域、片区、中心名称之类的)。这个集合用于确保合并信息的唯一性,确保表格不会错乱 ]* @param  {Object} oldMergeTabel [ 前一条组合好的connect数组信息,用于确保表格不会错乱 ]* @return {Object} 包含合并的行和列信息(其实就是 ‘合并表格的信息数组’ 的一个成员,看上面getMergeTabelArr方法的示例)*///  ================================================================ 分割线const oldArr = []; // 保存上一个数组let oldObj = {}; // 控制只跟上一个元素做对比,不跟整个数组对比// 正确的代码data.forEach((v, i) => {let newObj;let newKey = ''; // 保证唯一性的keykeywords.forEach(k => {newKey += `${v[k]}-`;});newKey += v[key];const oldIndex = oldArr.findIndex(n => n.key === newKey); // 保存的数组里是否存在与当前表头数据一样的元素(注意,findIndex找到的是第一个匹配的元素的下标)if (oldIndex !== -1 && oldObj.key === newKey) {newObj = {key: newKey,value: 0};oldArr[oldIndex].value++; // 找到重复项的第一项,值加1} else {newObj = {key: newKey,value: 1};}oldArr.push(newObj);oldObj = newObj; // 保存当前数据,用作与下一条数据的对比,看是否相同,相同把下一条数据的占用列置成0,这样表格不会错乱});const connect = oldArr.map(n => n.value);if (oldMergeTabel.length) {// 控制数组合并。如果有重复项也不能跨越过上一条的合并行oldMergeTabel.forEach((oldVal, i) => {const newVal = connect[i]; // 新值let count = 0; // connect数组各项值的和,const rule1 = newVal > oldVal && oldVal > 0;const rule2 = newVal < oldVal && newVal === 0;if (rule1 || rule2) {connect[i] = oldVal;connect.forEach(v => {count += v;}); // 赋值后计算connect数组各项值的和if (count > data.length) {// connect数组各项值加起来不能超过表格数据data的length,(可能有bug,以后再解决吧,哈哈哈)connect[i] = count - data.length;}}});}return {key: key,connect: connect};},// 查询数据queryData() {// 在工作中,一般是要调接口去查询数据,在查询之前,需要将mergeTabelArr置为空数组,然后在执行之后的操作。this.mergeTabelArr = [];// ...}}};
</script>
<style>.tableHeader {background: red !important;}
</style>

3、options.js 数据来源文件

/*** 表头配置*/const tableTitleData = [{minWidth: '100',prop: 'areaName',label: '片区'},{minWidth: '100',prop: 'managementAreaName',label: '省区'},{minWidth: '100',prop: 'centerName',label: '市区'}
];
const tableData = [{areaName: '东北',managementAreaName: '黑龙江',centerName: '哈尔滨市'},{areaName: '东北',managementAreaName: '黑龙江',centerName: '齐齐哈尔市'},{areaName: '东北',managementAreaName: '黑龙江',centerName: '鹤岗市'},{areaName: '东北',managementAreaName: '黑龙江',centerName: '牡丹江市'},{areaName: '东北',managementAreaName: '黑龙江',centerName: '佳木斯市'},{areaName: '东北',managementAreaName: '黑龙江',centerName: '绥化市'},{areaName: '东北',managementAreaName: '吉林',centerName: '长春市'},{areaName: '东北',managementAreaName: '吉林',centerName: '磐石市'},{areaName: '东北',managementAreaName: '吉林',centerName: '舒兰市'},{areaName: '华东',managementAreaName: '上海',centerName: '青浦区'},{areaName: '华东',managementAreaName: '上海',centerName: '徐汇区'},{areaName: '华东',managementAreaName: '上海',centerName: '黄浦区'},{areaName: '华东',managementAreaName: '上海',centerName: '浦东新区'},{areaName: '华东',managementAreaName: '上海',centerName: '松江区'},{areaName: '华东',managementAreaName: '上海',centerName: '嘉定区'}
];
export { tableTitleData, tableData };

4、完整 Table 合并代码 Demo

Github Demo


http://chatgpt.dhexx.cn/article/vTaPuRAP.shtml

相关文章

Element UI 的 table 单元格合并

项目中遇到表格单元格合并的需求&#xff0c;在此记录整个解决过程。 项目使用的是 Element UI&#xff0c;表格使用的是 table 组件。Element UI 的 table 表格组件中对单元格进行合并&#xff0c;需要使用 table 组件的 span-method 属性。 先看一张成果图&#xff08;完整代…

vxe-table 合并单元格合并列

效果如下&#xff1a; 合并单元格&#xff08;表头&#xff09;&#xff1a; :edit-render"{autofocus: .vxe-input--inner}"是控制是否可编辑单元格&#xff0c;和:edit-config搭配使用 合并列方法绑定:span-method&#xff0c;具体如下 <vxe-tableref"xT…

element ui 的table单元格合并

element ui中的table表格数据是动态生成的&#xff0c;如果说后台要求我们对单元格进行合并&#xff0c;这个时候需要借助一个api,:span-method"arraySpanMethod",arraySpanMethod为我们自己编写的合并单元格的方法。 下图是我在项目中合并的单元格 数据都是从那后…

element table表格合并行和列

element-ui 官网案例&#xff1a; table合并行或列 通过给table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组…

Element_Table的单元格合并

在进行Table的单元格合并的时候&#xff0c;出现了bug&#xff1a;合并第一列的第 x 和 x1 行时&#xff0c;第x2行的数据被第二列的数据替换&#xff0c;之后表格中的数据均向前移动了一格&#xff0c;导致数据展示错乱 分析 在进行单元格合并时&#xff0c;未考虑到动态合并…

el-table 怎么合并相同单元格

问题背景 项目需求table表格中&#xff0c;相同的类型合并成一个单元格展示。 问题描述 el-table并没有相关的语法直接合并&#xff0c;需要我们自己传入一个方法返回一个数组格式&#xff0c;来确定要合并行列。 解决问题 首先需要在 el-table 标签上绑定:span-method&quo…

el-table合并单元格

根据id相同合并单元格 <el-table selection-change"handleSelectionChange" :span-method"objectSpanMethod" :data"tableData" ref"multipleTable" ><el-table-column :selectable"checkSelect" type"sel…

Ant table表格合并单元格使用

Ant 合并单元格覆盖样式 项目需求&#xff1a; 最后一列用来展示详情&#xff0c;表格左侧点击行切换&#xff1b;要求选中行的样式和详情信息用一个边框凸显出来 结果如下&#xff1a; 切换效果展示如下&#xff1a; 实现过程&#xff1a; 在ant合并单元格demo中&#xff…

table 表格合并行或列

合并单元格 <table><tbody><tr><th colspan"2">我是占位符</th><th colspan"2">我是占位符</th></tr><tr><th rowspan"2">我是占位符</th><th>我是占位符</th>&…

Element Table 单元格中嵌套表格(Table) 合并行效果

在Element中实现表格合并行功能一般是通过自定义span-method方法&#xff0c;此方法要求表格数据源中需要合并行的单元格中数据相同&#xff0c;根据相同数据来实现合并算法。 本例通过在父Table单元格中嵌套子Table实现合并行效果&#xff08;也使用了span-method方法&#x…

Html Table 合并单元格

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title> </head> <body> <ol><li>基本表格</li><table border"2" bordercolor"black" …

使用原生table合并单元格

先上个我要实现的页面 例子1&#xff1a; 就是最近要开发这么一个页面&#xff08;这是个原型图&#xff0c;没有美化&#xff0c;大概是这个样子也都懂&#xff09;&#xff0c;刚看到的时候说实话有点儿懵的&#xff0c;第一次见到这样的表格&#xff0c;可以看到里面有很多…

el-table 合并单元格(合并行)

1. 添加 :span-method"objectSpanMethod" 2. 写objectSpanMethod 方法 //#region 合并单元格// 这个方法是 element-ui提供的单元格合并方法// objectSpanMethod 传入了 { row, column, rowIndex, columnIndex }// row: 当前行// column: 当前列// rowIndex&…

table表格 ---合并单元格

1、合并表头 第一种方法 利用table的 :header-cell-style属性 <el-table:data"tableData"height"400px"max-height"400px"size"small":header-cell-style"headerStyle"fit > methods: {headerStyle({ row, rowIndex …

table表格单元格的合并详解

1.html实现表格 <el-tablemax-height"300":columns"columns":data"tableData":show-index"false":span-method"objectSpanMethod":header-cell-style"{ background: #eef0f6 }" /> 2.记录每个字段合并数的…

table表格--合并单元格

知识点概要&#xff1a; 1、colpan:横向合并"n"个单元格--n:默认1 2、rowspan:纵向合并"n"个单元格--n:默认1 代码demo&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/lo…

table表格中单元格的合并

目录 table表格中单元格的合并 table表格中单元格的合并很多朋友不一定了解&#xff0c;今天我就写一篇博客来跟大家分享一下table表格中的跨行合并和跨列合并。 我们先看一个合并过的表格&#xff0c;大家可以先思考一下这种表格通过代码是怎么实现的。 解析&#xff1a;我们…

类型“HTMLElement”上不存在属性“getContext”

ts警告&#xff1a;类型“HTMLElement”上不存在属性“getContext” 修改代码如下&#xff1a; const state reactive({canvasDom: null as HTMLCanvasElement | null,canvasCtx: null as CanvasRenderingContext2D | null, });onMounted(() > {state.canvasDom <HTML…

“TypeError: Cannot read properties of null (reading ‘getContext‘)“

目录 一、报错截图 二、使用场景 三、代码截图 四、报错原因 五、解决办法 一、报错截图 二、使用场景 第一次在vue项目种使用canvas&#xff0c;跟着网上教程做&#xff0c;标签canvas写好了&#xff0c;dom元素获取了&#xff0c;简单“画”了一下&#xff0c;运行之后报…

setcontext getcontext makecontext swapcontext

Linux上下文切换以及协程 上下文切换&#xff0c;听起来虚无缥缈&#xff0c;什么是上下文&#xff0c;切换又是指的是什么&#xff1f;其实上下文就可以理解为一个进程所运行的相关的寄存器值&#xff0c;即包括sp/bp/pc等值&#xff0c;换句话说&#xff0c;一个上下文&#…