将excel表格转换为element table(下)

在‘将excel表格转换为element table(上)’我们把excel 转换后通过数据重构绑定到了element table上,现在要做的就是根据源文件进行行列进行合并操作

先看看最终处理的结果
最终效果图

这里在一步步分析实现步骤。

先分析一下合并的逻辑
合并逻辑
大致思路理理如上。

思路有了接下来就是一步步的去实现了

  • 第一步
    首先通过分组的数据找到哪些行有合并操作
      this.existMergeRow = {};this.existMergeCol = {};this.mergeColAtRow = {};const existMergeRow = this.existMergeRow// 合并行行为记录const existMergeCol = this.existMergeCol // 合并列行为记录const mergeColAtRow = this.mergeColAtRow;// 记录合并列是属于哪一行的// 计算出哪些行有合并参与合并行为,因为有的行完全没有合并操作,在table merge操作是需要特殊处理renter {rowspan:1,colspan:1}Object.keys(categoryCN).map(key => {categoryCN[key].forEach((e) => {// 有e.rowspan才执行如下操作if (e.rowspan) {if (!existMergeRow[key]) { existMergeRow[key] = {} }let rowspanNum = parseInt(e.rowspan);const rowNum = e.rowNum - 4;// 行数existMergeRow[key][rowNum] = true;// 标识他合并了let step = 1;while (rowspanNum > 1) {existMergeRow[key][rowNum + step] = true;// 标识他合并了step++;rowspanNum -= 1;}}
})
  • 第二步
    根据分组数据找到哪些列有合并操作,我们直接找上面的方法中添加如下代码来记录有合并操作的列
          if (e.colspan) {const keynum = parseInt(key) - 1const rowNumm = e.rowNum - 4;const colNum = e.colNum;// 列数// 行号:列号if (!mergeColAtRow[rowNumm]) { mergeColAtRow[rowNumm] = {} }mergeColAtRow[rowNumm][colNum] = true;if (!existMergeCol[keynum]) { existMergeCol[keynum] = {} }let colspanNum = parseInt(e.colspan);existMergeCol[keynum][colNum] = true;// 标识他合并了let colstep = 1;while (colspanNum > 1) {existMergeCol[keynum][colNum + colstep] = true;// 标识他合并了mergeColAtRow[rowNumm][colNum + colstep] = true;colstep++;colspanNum -= 1;}}
  • 第三步
    拷贝objectSpanMethod 来进行合并操作,大致如下
    objectSpanMethod ({ rowIndex, columnIndex }) {// 需要合并的列const mergeRow = this.categoryCN[columnIndex];// 合并列先找到那一例属于哪一行const mergeColAtRow = this.mergeColAtRow[rowIndex];// 通过列index 获取这一列,哪些行有合并行为const existMergeRow = this.existMergeRow[columnIndex]const existMergeCol = this.existMergeCol[columnIndex]if (mergeRow) {let rowspanObj = mergeRow.find((ee, index) => (ee.rowNum - 4) == rowIndex)// 第一列if (columnIndex == 0) {// 判断改行是否参与合并行为if (existMergeRow[rowIndex]) {if (rowspanObj) {const _row = rowspanObj.rowspanconst _col = rowspanObj.colspanreturn {rowspan: _row ? _row : _col ? 1 : 0,colspan: _col ? _col : _row ? 1 : 0}} else {return {rowspan: 0,colspan: 0}}}} else {  // 其它列,合并操作// 有行合并也有列合并if (existMergeRow && existMergeRow[rowIndex] && existMergeCol && existMergeCol[columnIndex]) {if (rowspanObj) {const _row = rowspanObj.rowspanconst _col = rowspanObj.colspanreturn {rowspan: _row ? _row : _col ? 1 : 0,colspan: _col ? _col : _row ? 1 : 0}} else {return {rowspan: 0,colspan: 0}}} else if (existMergeRow && existMergeRow[rowIndex]) {// 只有行合并行为if (rowspanObj) {const _row = rowspanObj.rowspanconst _col = rowspanObj.colspanreturn {rowspan: _row ? _row : _col ? 1 : 0,colspan: _col ? _col : _row ? 1 : 0}} else {// 除开第一列,其它行进行合并后,未合并的行需要隐藏,避免出现多行错乱问题return {rowspan: 0,colspan: 0}}}}}// 找合并列对应的那一行,避免所有列做重复操作if (mergeColAtRow && mergeColAtRow[columnIndex]) {const mergeRowPlus = this.categoryCN[columnIndex];if (mergeRowPlus) {// 只有列表合并,let colspanObj = mergeRowPlus.find((ee, index) => ee.colNum == columnIndex && (ee.rowNum - 4) == rowIndex)if (colspanObj) {const _col = colspanObj.colspanreturn {rowspan: 1,colspan: _col}}} else {return {rowspan: 0,colspan: 0}}}},

这个逻辑有的多 , 因为第一列合并操作有点特殊需要单独操作,后面的行合并又是单独的,而列合并又需要单独写逻辑。

哎不管了经过上面一系列的折腾简单的行列合并算是可以实现了,其它的情况后续再研究研究…

  • 最后把源码与测试数据保存一份到 github.com/dengxiaoning/excelToTable,如有需要的小伙伴请自取

补充【20240704】:上面完成了行,列简单的合并操作,但是在具有行列同时合并的操作时就会出现问题,于是今个几个晚上的思考找到了解决方案

分析图
如图

1、 存在行列同时合并的情况比较特殊,如合并一个两行两列, 那么在合并第一行时就已经完成了行列合并操作,下面的一行在同一个位置就不需要做任何操作

2、 找到存在有行列同时合并的那一行数据,根据columnIndex 再从分组数据组查找是否存在真正合并的操作
如果没有那就代表改行只是参与了合并行为,但他本身不需要进行合并(上一行或列已经完成了合并操作)

核心代码如下

1、收集哪些存在与行列合并相关的所有行数据,在数据组装方法assemblyTableData中增加如下判断

      if (e.rowspan && e.colspan) {const keynum = parseInt(key) - 1const rowNumm = e.rowNum - 4;const colNum = e.colNum;// 列数// 行号:列号if (!existRowColMerge[rowNumm]) { existRowColMerge[rowNumm] = {} }existRowColMerge[rowNumm][colNum] = true;// 他合并了几行,记录下一次合并let rowspanNum = parseInt(e.rowspan);// if (!existMergeCol[keynum]) { existMergeCol[keynum] = {} }let colspanNum = parseInt(e.colspan);// existMergeCol[keynum][colNum] = true;// 标识他合并了let colstep = 1;while (colspanNum > 1) {// existMergeCol[keynum][colNum + colstep] = true;// 标识他合并了existRowColMerge[rowNumm][colNum + colstep] = true;colstep++;colspanNum -= 1;}// 存在行列同时合并的情况比较特殊,如合并一个两行两列,// 那么在合并第一行时就已经完成了行列合并操作,下面的一行在同一个位置就不需要做任何操作let step = 1;while (rowspanNum > 1) {if (!existRowColMerge[rowNumm + step]) { existRowColMerge[rowNumm + step] = {} }existRowColMerge[rowNumm + step] = existRowColMerge[rowNumm];// 下一行 标识他合并了,可以直接使用上一行的数据step++;rowspanNum -= 1;}

2、在合并方法objectSpanMethod中增加如下行列合并判断

  // 【存在行列同时合并】找到存在有行列同时合并的那一行数据,根据columnIndex 再从分组数据组查找是否存在真正合并的操作// 如果没有那就代表改行只是参与了合并行为,但他本身不需要进行合并(上一行或列已经完成了合并操作)if (existRowColMerge && existRowColMerge[columnIndex]) {const mergeRowPlus = this.categoryCN[columnIndex];if (mergeRowPlus) {// 存在行列同时合并,let colspanObj = mergeRowPlus.find((ee, index) => ee.colNum == columnIndex && (ee.rowNum - 4) == rowIndex)if (colspanObj) {const _col = colspanObj.colspanconst _row = colspanObj.rowspanreturn {rowspan: _row,colspan: _col}} else {return {rowspan: 0,colspan: 0}}} else {return {rowspan: 0,colspan: 0}}}

最后的合并效果
合并效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3-数据提取方法1(json)(6节课学会爬虫)

3-数据提取方法1(json)(6节课学会爬虫) 1,Json2,哪里会返回json的数据(值得尝试的操作)3,Json字符串转换成字典或python类型进行数据提取(1)Json.…

农夫山泉:玩一个“弯道超车”的“新游戏”

今年夏天,有一款产品的爆火,仿佛上演了一出“欧亨利式”的好戏,既出人意料又在情理之中。它就是农夫山泉的“冰杯”。 在小红书搜索关键词“冰杯”后,我们会发现,相关笔记达到4万篇,相关商品超过8000件&am…

基于改进滑模、经典滑模、最优滑模控制的永磁同步电机调速系统MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 针对永磁同步电机调速系统的响应性能和抗干扰能力问题,本文做了四个仿真,分别为:永磁同步电机的PID控制调速系统、基于传统滑模控制的永磁同步电机的调速系统、最…

文件存储(阿里云OSS)的实现

简介 文件包括:视频、音频、图片等。我们一般在开发的过程中,会将文件存储在本地,但是这种情况下会遇到性能的瓶颈、磁盘爆满等问题。那么我们就需要给文件重新找一个存储的位置就是云上。此篇介绍阿里云的文件存储的实现 1、阿里云对象存储…

Mybatis入门の基础操作

1 Mybatis概述 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的…

# mysql 中文乱码问题分析

mysql 中文乱码问题分析 一、问题分析: MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集,如 latin1、utf8、utf8mb4 等,如果在创建数据库、数据表或者字段时没有指定正确的字符集,或者在插入数据时使用了与…

Go语言特点、编译及命令

本文主要分为三部分内容分别为:Go语言的特点介绍;编译windows、linux环境文件及Go命令。 目录 Go语言特点 编译文件 编译window文件 编译linux文件 Go命令(build/run/install/env) 编译文件 直接运行程序 安装程序 配置G…

PG实践|内置函数之GENERATE_SERIES之深入理解(二)

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师 🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 🔥 三连支持:欢迎 ❤️关注…

#LinuxC高级 笔记二

makefile gcc gdb makefile 1. 分文件编程 1.1 源文件&#xff1a;.c结尾的文件 包含main函数的.c 包含子函数的.c 1.2 头文件&#xff1a;.h结尾的文件 头文件、宏定义、typedef 、结构体、共用体、枚举、函数声明 include引用时“”和<>的区别&#xff1a; <>去系…

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff1a;Java运行时环境开发工具&#xff1a;javac&#xff08;编译工具&#xff09;、java&#xff08;运行…

23432443

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

聚四氟乙烯消解管/PTFE四氟消化管/配套各厂家石墨消解仪

四氟消解瓶&#xff0c;通常指的是采用聚四氟乙烯&#xff08;PTFE&#xff0c;也称为特氟龙或铁氟龙&#xff09;材料制成的实验室消解容器。 以下是关于四氟消解瓶的一些基本信息&#xff1a; 材质特性&#xff1a; 四氟消解瓶由PTFE材料制成&#xff0c;具有极佳的耐腐蚀…

Python脚本:将Word文档转换为Excel文件

引言 在文档处理中&#xff0c;我们经常需要将Word文档中的内容转换成其他格式&#xff0c;如Excel&#xff0c;以便更好地进行数据分析和报告。针对这一需求&#xff0c;我编写了一个Python脚本&#xff0c;能够批量处理指定目录下的Word文档&#xff0c;将其内容结构化并转换…

PTrade如何获取技术值班?如get_RSI - 相对强弱指标;PTrade量化软件如何获取?

get_RSI - 相对强弱指标 get_RSI(close, n6) 使用场景 该函数仅在回测、交易模块可用 接口说明 获取相对强弱指标RSI指标的计算结果 PTrade是恒生公司开发的一款专业量化软件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 参数 close&#xff1a;价格…

.NET发布成单个文件后获取不到程序所在路径的问题

.net程序不发布成单个文件&#xff0c;所以运行都是正常的&#xff0c;但是发布成单个文件后发现使用&#xff1a; var basePath Path.GetDirectoryName((System.Reflection.Assembly.GetExecutingAssembly().Location)); 获取不到应用程序所在的路径了。 找一下几个获取本程…

从混乱到有序:企业级在线文档助力中小企业数字化转型的蜕变

在当今数字化浪潮下&#xff0c;企业的数字化转型已成为行业发展的必然趋势。他们数字化转型的痛点在哪里&#xff1f;资金有限、技术人才短缺和管理的复杂性等。很多时候&#xff0c;它们的文件管理比较混乱&#xff0c;大量的知识和数据分散在不同的系统&#xff0c;形成了数…

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…

MySQL:MySQL总结

文章目录 MySQL思维导图基础实际在 Innodb 存储引擎中&#xff0c;会用一个特殊的记录来标识最后一条记录&#xff0c;该特殊的记录的名字叫 supremum pseudo-record &#xff0c;所以扫描第二行的时候&#xff0c;也就扫描到了这个特殊记录的时候&#xff0c;会对该主键索引加…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…

重温react-10(函数组件和类组件的ref获取方式)

App.js的代码 06是函数组件 07是类组件 import React, { useEffect, useRef } from react; import LearnFunction06 from ./LearnFunction06; // 函数组件和类组件的ref使用方式 import LearnFunction07 from ./LearnFunction07; // 函数组件和类组件的ref使用方式 export de…