当前位置: 首页 > news >正文

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

最近有个功能需要将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];}})
省略部分......},

最后效果

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

待续…

相关文章:

  • springcloud-gateway 路由加载流程
  • 获取目标机器的ssh反弹权限后,如何通过一台公网服务器的服务 jar 包进行偷梁换柱植入目录进行钓鱼,从而获取目标使用人的终端设备权限和个人信息?
  • 记因hive配置文件参数运用不当导致 sqoop MySQL导入数据到hive 失败的案例
  • MySQL 基础概念
  • 编写动态库
  • YOLOv8 的简介 及C#中如何简单应用YOLOv8
  • 《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》
  • 二刷 动态规划
  • 用JSZip,FileSaver 有现成cdn的http图片或者文件地址,弄成压缩包导出,解决如果文件名字都是一样的只导出一个图片或文件的方法
  • 定位OOM(Out of Memory)
  • 如何指定Microsoft Print To PDF的输出路径
  • 一键搞定长图处理:高效精准,轻松实现按固定高度像素切割
  • java TCP服务器与客户端通信示例
  • laravel对接百度智能云 实现智能机器人
  • Docker使用daocloud镜像加速
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【译】理解JavaScript:new 关键字
  • Docker下部署自己的LNMP工作环境
  • Javascript基础之Array数组API
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SQLServer插入数据
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 简单易用的leetcode开发测试工具(npm)
  • 模型微调
  • 日剧·日综资源集合(建议收藏)
  • 说说动画卡顿的解决方案
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • FaaS 的简单实践
  • ​马来语翻译中文去哪比较好?
  • #etcd#安装时出错
  • (3)STL算法之搜索
  • (四)opengl函数加载和错误处理
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Google的Objective-C编码规范
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bashrc在哪里,alias妙用
  • .net core 依赖注入的基本用发
  • .net mvc部分视图
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net下的签名与混淆
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @Not - Empty-Null-Blank
  • @property @synthesize @dynamic 及相关属性作用探究
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [17]JAVAEE-HTTP协议
  • [20180129]bash显示path环境变量.txt
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [ESP32] 编码旋钮驱动
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等
  • [JAVA数组] 三个数的最大乘积