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

news2024/12/23 15:01:39

最近有个功能需要将excel展示到html 界面里面,看是简单的一个需求也是需要费尽心思才完得成

原始数据
原始文件

想要把excel 读取出来,于是使用xlsl的插件

npm i xlsx

通过插件可以获取到已经分析好的数据
在这里插入图片描述

然后使用sheet_to_html将数据转换为html 再使用v-html加载数据

<div v-html="rowsHtml"
       class="continertable"></div>

预览效果
预览

由于行列内容太多看起来有些乱,这效果的确不是想要的,于是想到了使用element ui 的table 来加载

案例
于是根据这个案例开始重新组织xlsx 加载返回的数据

首先要将数据行列重新组装

 dealTableData (worksheet) {
      // const worksheet = workbook.Sheets[sheetNames[0]];
      // 拿到这张表中表格数据的范围,
      const range = utils.decode_range(worksheet['!ref']);
      // console.log(worksheet['!ref']);  // A1:E5
      //保存数据范围数据
      const row_start = range.s.r; // 表格范围,开始行的数据
      const row_end = range.e.r; // 表格范围,结束行的数据
      const col_start = range.s.c; // 表格范围,开始列的数据
      const col_end = range.e.c; // 表格范围,结束行的数据
      const tableMerge = worksheet['!merges'] || []; // 表格中进行单元格合并操作的数据
      var oo = [];
      var tableArr = []; // 存储所以的td 数组
      var preamble = "<tr>"; // 转 html 时进行拼接
      // let rows = [], row_data, i, addr, cell;
      //按行对 sheet 内的数据循环
      //首先读取当前对象内的所有行数据,从开始到结束
      for (var R = row_start; R <= row_end; ++R) {
        var innerRow = []
        var innerRowJson = []
        // out.push(make_html_row(ws, r, R, o));
        // 读取列数据,开始到结束
		省略部分................

      // 组装表头
      this.assemblyTableData(tableArr);

      this.asseblyTableColumn(tableArr);
    },

再是组装行列,增加asseblyTableColumn 方法

这里由于是多级表头,所以需要一个二维数组

    // 组装一个表单类字段
    asseblyTableColumn (arr) {
      const firstArr = arr[0];
      const secondArr = arr[1];
      const thirdArr = arr[2];
      const secondChildren = []
      let thirdObj = {}
      const thirdChildren = []
      // 数组第一个为表头
      const resArr = [{
        label: firstArr[0]['name'],
        ...firstArr[0]
      }];

      thirdArr.forEach(e => {
        let propStr = e.id.match(propRegex)
        thirdChildren.push({
          label: e.name,
          prop: propStr[0],
          ...e
        })
      })
      secondArr.forEach(e => {
        let propStr = e.id.match(propRegex)
        // 包含colspan为下一个表头
        if (e.hasOwnProperty('colspan')) {
          thirdObj = {
            label: this.removeHTMLTags(e.name),
            ...e,
            children: thirdChildren,
          }
        } else {

          secondChildren.push({
            label: e.name,
            prop: propStr[0],
            ...e
          })
        }
      })
      secondChildren['children'] = [thirdObj];
      resArr[0]['children'] = secondChildren;
      this.tableHeadArr = resArr
    },

再增加一个重构表单数据的方法assemblyTableData

    assemblyTableData (arr) {
      this.categoryCN = [];
      /**
       * 合并信息
       * [{
       * rowNum:0,
       * colNum:0,
       * rowspan:0,
       * colspan:0,
       * }]
       */
      const spInfo = [];
      this.resTableData = [];
      // 从第三一个开始
      for (let i = 3; i < arr.length; i++) {
        let eachObj = {}
        let rowcolObj = {}
        arr[i].forEach(e => {
          let propStr = e.id.match(propRegex)
          eachObj[propStr[0]] = this.removeHTMLTags(e.name);
          const colName = propStr[0].match(/\w$/)[0];
          const rowNum = e.id.match(rowNumRegex)[0]

          if (e.hasOwnProperty('rowspan') && e.hasOwnProperty('colspan')) {
            spInfo.push({
              rowspan: e['rowspan'],
              colspan: e['colspan'],
              rowNum,
              colNum: colNumArr.findIndex(e => e === colName)
            })
          } else if (e.hasOwnProperty('rowspan')) {
            spInfo.push({
              rowspan: e['rowspan'],
              rowNum,
              colNum: colNumArr.findIndex(e => e === colName)
            })
          } else if (e.hasOwnProperty('colspan')) {
            spInfo.push({
              colspan: e['colspan'],
              rowNum,
              colNum: colNumArr.findIndex(e => e === colName)
            })
          }

        })
        this.resTableData.push(eachObj)
      }
      const categoryCN = this.categoryCN;
      // 根据colNum进行分组,便于合并
      spInfo.forEach(cn => {
        if (categoryCN[cn.colNum]) {
          categoryCN[cn.colNum].push(cn)
        } else {
          categoryCN[cn.colNum] = [cn];
        }
      })
省略部分......

    },

最后效果

效果
看起来是要好很多了,接下来就是进行行列合并的操作了

待续…

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

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

相关文章

ROS2 RQT

1. RQT是什么 RQT是一个GUI框架&#xff0c;通过插件的方式实现了各种各样的界面工具。 强行解读下&#xff1a;RQT就像插座&#xff0c;任何电器只要符合插座的型号就可以插上去工作。 2.选择插件 这里我们可以选择现有的几个RQT插件来试一试&#xff0c;可以看到和话题、参…

视频太大怎么压缩变小?6款视频压缩软件免费版分享

视频太大怎么压缩得又小又清晰呢&#xff1f;无论是视频文件传输、视频文件存储&#xff0c;还是进行自媒体视频上传&#xff0c;都对视频文件的大小有一定的限制。高质量的视频文件往往伴随着文件占据大量存储空间&#xff0c;导致文件传输速度变慢。今天教大家6种视频压缩软件…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示&#xff0c;企业使用WLAN…

搜维尔科技:数据手套为什么要选择SenseGlove

了解 SenseGlove SenseGlove 是一支由电子工程师、触觉研究人员和计算机视觉专家、XR 开发人员、UX 设计师和产品创新者组成的科幻爱好者团队&#xff0c;他们拥有丰富人类能力和赋予 Metaverse 意义的技能和热情。 推进触觉技术是我们实现这一目标的方式。 公司及产品背景 S…

将多个SQL查询合并的两种方式

说明&#xff1a;单个简单查询是非常容易的&#xff0c;但是为了避免多次访问访问数据库&#xff0c;我们会尽可能通过表关联将业务所需要的字段值一次性查出来。而有时候不太清楚表之间的关联关系&#xff08;这取决于对业务的熟悉程度&#xff09;&#xff0c;或者实际情况就…

ubuntu 安装并启用 samba

环境&#xff1a;ubuntu server 24.04 步骤如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增内容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

2021强网杯

一、环境 网上自己找 二、步骤 2.1抛出引题 在这个代码中我们反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

RFID技术在粉末涂料配料生产线的精准应用

RFID技术在粉末涂料配料生产线的精准应用 应用背景 随着科技的快速发展&#xff0c;智能化、自动化已经成为现代工业生产的重要趋势。RFID&#xff08;无线射频识别&#xff09;技术以其独特的优势&#xff0c;如非接触式识别、高速读取、大容量数据存储等&#xff0c;在多个…

206.贪心算法:摆动序列(力扣)

代码展示 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size(); // 如果数组长度小于等于1&#xff0c;返回数组长度int curdiff 0; // 当前元素和前一个元素的差值int prediff 0; // 前一个差值int…

品牌推广怎么样?掌握正确做法,让品牌大放异彩!

品牌推广对于初创公司来说是一项至关重要的任务。在市场众多品牌中&#xff0c;如何脱颖而出&#xff0c;是每个品牌方都要考虑的问题。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;我来分享下&#xff0c;如何推广&#xff0c;可以让品牌…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不然改乱了&#xff0c;可能就…

zabbix“专家坐诊”第244期问答

问题一 Q&#xff1a;请教一下&#xff0c;我的zabbix6.0配置的基于snmptrap上报的日志提取关键字推送告警&#xff0c;正则表达式能否帮忙看看怎么弄&#xff1f;我这配置的提示一直不正确&#xff1f; A&#xff1a;具体看一下这里的信息。 Q&#xff1a;这个我是直接复制的…

亚马逊卖家专属ERP系统,无任何隐形FY。

三千多终身使用的ERP&#xff0c;图片翻译、文本图片翻译&#xff0c;无任何隐藏fy&#xff0c;不限制授权店铺&#xff0c;不限制开通子账号。 现在来讲下我们店飞飞ERP的铺货功能。 点击数据采集&#xff0c;选择需要的产品&#xff0c;可以批量编辑、批量编辑价格、一键翻…

权限控制信息

查看权限控制信息 修改权限控制信息 chmod命令 作用&#xff1a;修改文件、文件夹的权限细节&#xff0c;即第一图中序号1的部分。只能是文件、文件夹所属用户或root用户有权修改。 语法&#xff1a;chmod [-R] 权限 文件或文件夹 选项&#xff1a; -R&#xff0c; 对文件夹内…

如何申请小牛翻译API,超简单哦~~~

1.【注册】或【登录】小牛翻译官网账号。 账号注册成功后&#xff0c;小牛翻译每天提供免费的100积分&#xff0c;积分是全平台通用的&#xff0c;100积分相当于20万字符/34个文档/34张图片/25次语音翻译。&#xff08;在线翻译和API服务均可用哦~&#xff09; 2.登录账号后&a…

非平稳信号的时频表示-基于本征模态函数(MATLAB)

时频分析思想萌芽于匈牙利物理学家 Gabor 在 1946 年所提出的 Gabor 展开理论&#xff0c;随后以此为基础发展出著名的线性时频变换方法—短时傅里叶变换。短时傅里叶变换假设分析信号在有限时长内具有平稳特性&#xff0c;它首先将时间与频率均为有限支撑的窗函数与分析信号进…

六西格玛培训:不只是理论,更是实战中的利器——张驰咨询

六西格玛作为一种强大的流程改进和质量管理工具&#xff0c;其应用范围已经远远超出了传统制造业的界限&#xff0c;逐步渗透到金融业、互联网以及新能源等前沿领域。以下张驰咨询将结合之前的分析&#xff0c;展示六西格玛培训在这些行业中的成功案例及其带来的深远影响。 制造…

【代码随想录】【算法训练营】【第56天】 [卡码98]所有可达路径

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 56&#xff0c;周二&#xff0c;继续ding~ 题目详情 [卡码98] 所有可达路径 题目描述 卡码98 所有可达路径 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言…

Spring Cloud Alibaba-Nacos服务注册和配置中心

目录 概述下载安装 Nacos服务注册中心原理配置服务提供者配置服务消费者负载均衡 Nacos服务配置中心新建一个配置中心服务Nacos控制台配置历史配置回滚 Nacos数据模型三元组是什么默认值Service就是微服务Nacos图形界面三种方案加载配置DataId方案Group方案Namespace方案 文献参…

2024软件设计师经验贴(一考就过)

2024软件设计师经验贴&#xff08;一考就过&#xff09; 第一阶段、基础积累&#xff1a;把书读厚 这一阶段可以跟着视频、书籍或文章进行基础知识的学习。 推荐的视频系列&#xff1a; 「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 40–14.3设计模式 推荐的文…