在这里插入图片描述

需求:

  1. 完成excel表格内容转json,excel表格内可能存在多个表格,要求全部解析出来。
  2. 完成表格内合服功能,即:提取表格内老服务器与新服务器数据,多台老服务器对应合并到一台新服务器上
    3.最终输出结果为:[{‘10086-l’:[‘10086-1’,‘10086-2’,…]}] …

一、前置准备

安装依赖

首先确保安装 xlsx 库:

npm install xlsx
核心思路

嵌套表格通常通过空行、固定标题或特定标识分隔,且子表格结构一致(如列数、表头相同)。需通过遍历行数据,识别子表格的边界(起始行、结束行),再提取每个子表格的内容并转换为 JSON。

二、实现步骤及代码

假设 Excel 结构如下(示例):
包含 3 个子表格,以空行分隔,每个子表格有表头(name、id、老服务器,新服务器)和数据行。

1. 读取 Excel 文件并解析工作表
return new Promise((resolve, reject) => {const reader = new FileReader();// 开始读取文件内容reader.readAsArrayBuffer(raw);reader.onload = (e) => {// 将文件内容读取为ArrayBuffer并解析为workbook对象const data = e.target?.result;// 第一行开始 第五行结束const workbook = XLSX.read(data, { type: "array" });// 获取第一个工作表数据并转换为JSON格式const sheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[sheetName];const rows = XLSX.utils.sheet_to_json(worksheet, {header: 1,raw: false, // 保留原始值(字符串)});};// 处理文件读取错误reader.onerror = (error) => {reject(error);};});
2. 识别子表格边界

通过空行(元素全为 undefined 或空字符串)分隔子表格,记录每个子表格的起始行和结束行:

// 存储所有子表格的范围:{ start: 行索引, end: 行索引 }
const tableRanges = [];
let currentStart = null;// 遍历所有行,识别子表格边界
for (let i = 0; i < rows.length; i++) {const row = rows[i];// 判断是否为空行(过滤全空或仅含空字符串的行)const isEmptyRow = row.every(cell => cell === undefined || cell === null || cell === '');if (!isEmptyRow) {// 非空行:若未记录起始行,则标记为子表格开始if (currentStart === null) {currentStart = i;}} else {// 空行:若已记录起始行,则标记为子表格结束if (currentStart !== null) {tableRanges.push({ start: currentStart, end: i - 1 });currentStart = null;}}
}// 处理最后一个子表格(若文件末尾无空行)
if (currentStart !== null) {tableRanges.push({ start: currentStart, end: rows.length - 1 });
}
3. 提取子表格数据并转换为 JSON

假设每个子表格的第一行为表头,后续为数据行:

// 存储最终结果:键为子表格索引,值为数据数组// 存储最终结果:键为子表格索引,值为数据数组const result = [];tableRanges.forEach((range, tableIndex) => {const { start, end } = range;// 表头行(子表格起始行)const headers = rows[start].filter(cell => cell !== undefined && cell !== ''); // 过滤空单元格// 数据行(从表头下一行到结束行)const tableData = [];for (let i = start + 1; i <= end; i++) {const row = rows[i];const rowData = {};// 映射表头与数据(忽略超出表头列数的单元格)headers.forEach((header, colIndex) => {rowData[header] = row[colIndex] || ''; // 空单元格用空字符串代替});tableData.push(rowData);}tableData.forEach(rowData => {if (rowData.newServer) {}});let data = transformServers(tableData)if (Object.keys(data).length) {result.push(data)}});

三、关键处理说明

1. 边界识别优化

若子表格通过特定标题(如 “表格 1 开始”)分隔,可修改空行判断逻辑,例如:

// 假设子表格以 "表格x" 开头
const isTableHeader = row[0]?.startsWith('表格');
if (isTableHeader) { /* 标记子表格开始 */ }
  1. 合并单元格处理
    若存在合并单元格,xlsx 会仅在合并区域的首个单元格保留值,其他为 undefined。可通过以下方式填充合并单元格数据:
// 先获取合并单元格信息
const merges = worksheet['!merges'] || [];
// 遍历合并区域,复制首个单元格的值到其他位置
merges.forEach(merge => {const { s, e } = merge; // s: 起始行/列, e: 结束行/列const value = rows[s.r][s.c];for (let r = s.r; r <= e.r; r++) {for (let c = s.c; c <= e.c; c++) {rows[r][c] = value;}}
});

数据类型转换

默认输出为字符串,可根据需求自行格式化

function transformServers(servers) {const result = {};let currentNewServer = null;let keys = Object.keys(servers[0]);for (const serverInfo of servers) {// 如果当前项有newServer值,更新当前newServerif (serverInfo[keys[3]]) {currentNewServer = serverInfo[keys[3]];// 初始化数组并添加当前serverresult[currentNewServer] = [serverInfo[keys[2]]];}// 如果当前有活跃的newServer且当前项没有newServer,添加到数组else if (currentNewServer) {result[currentNewServer].push(serverInfo[keys[2]]);}}return result;
}

四、页面代码部分

<template>
<el-dialogtitle="提示":visible.sync="dialogVisible"width="500":before-close="handleClose"><el-uploadclass="upload-demo"dragaction="''":multiple="false":auto-upload="false":file-list="fileList":on-change="handleChange":on-remove="beforeUpload"ref="upload":limit="1"accept=".xlsx,.xls"><i class="el-icon-upload"></i><div class="el-upload__text"><div>将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip">上传excel文件,请勿超过5M,每次最多只能上传1个文件</div></div></el-upload><span slot="footer" class="dialog-footer"><el-button type="primary" @click="toJson">tojson</el-button><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="dialogVisible = false">确 定</el-button></span>
</el-dialog>
</template>
<script>import {excelToJson} from '../../../utils/excel2json'export default {data() {return {dialogVisible: false,fileList: [],};},methods: { handleChange(file, fileList){console.log(fileList,file,'---');this.fileList = fileList; },beforeUpload(file,fileList){console.log(fileList,'--');this.fileList = fileList; },handleClose(done) {this.$confirm('确认关闭?').then(_ => {done();}).catch(_ => {});},toJson(){console.log(this.fileList);excelToJson(this.fileList[0].raw)}},};
</script>
<style lang="scss">
.upload-demo{
.el-upload {width:100%;
}
.el-upload-dragger{width:100%;
}width:100%;
}
</style>
五、总结

通过上述步骤,可实现对嵌套规律表格的解析:

读取 Excel 并转换为行数组;
根据空行或特定标识识别子表格范围;
提取每个子表格的表头和数据,映射为 JSON 对象;
按需处理合并单元格和数据类型。
根据实际 Excel 结构,只需调整边界识别逻辑和表头映射规则即可适配不同场景。

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

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

相关文章

Qwen-OCR:开源OCR技术的演进与全面分析

目录 一、Qwen-OCR的历史与发展 1.1 起源与早期发展(2018-2020) 1.2 技术突破期(2020-2022) 1.3 开源与生态建设(2022至今) 二、技术竞品分析 2.1 国际主流OCR解决方案对比 2.2 国内竞品分析 三、部署需求与技术规格 3.1 硬件需求 3.2 软件依赖 3.3 云部署方案 四、…

可视化+自动化:招聘管理看板软件的核心技术架构解析

引言&#xff1a;现代招聘的挑战与转型随着全球化和科技的迅速发展&#xff0c;企业的人力资源管理面临着前所未有的挑战。尤其是在招聘环节&#xff0c;随着人才市场的竞争日益激烈&#xff0c;企业必须在确保招聘质量的同时&#xff0c;提升招聘效率。这不仅要求招聘人员具备…

【数据结构】——栈(Stack)的原理与实现

目录一. 栈的认识1. 栈的基本概念2.栈的基本操作二. 栈的核心优势1. 高效的时间复杂度2. 简洁的逻辑设计3. 内存管理优化三. 栈的代码实现1.栈的结构定义2. 栈的初始化3. 入栈 &#xff08;动态扩容&#xff09;4. 出栈5. 取栈顶数据6. 判断栈是否为空7. 获取栈的数据个数8.销毁…

使用TexLive与VScode排版论文

前言 中文稿目前已经完成了&#xff0c;现在要转用latex排版&#xff0c;但我对这方面没有接触过&#xff0c;这里做一个记录。 网页版Overleaf&#xff1a;Overleaf, 在线LaTeX编辑器。 TeXWorks&#xff1a;论文神器teXWorks安装与使用记录。 这里我还是决定采用Vscode作…

每日一题:2的幂数组中查询范围内的乘积;快速幂算法

题目选自2438. 二的幂数组中查询范围内的乘积 还是一样的&#xff0c;先讲解思路&#xff0c;然后再说代码。 题目有一定难度&#xff0c;所以我要争取使所有人都能看懂&#xff0c;用的方法会用最常规的思想。关于语言&#xff0c;都是互通的&#xff0c;只要你懂了一门语言…

Ceph数据副本机制详解

Ceph 数据副本机制详解 Ceph 的数据副本机制是其保证数据可靠性和高可用性的核心设计&#xff0c;主要通过多副本&#xff08;Replication&#xff09; 和 纠删码&#xff08;Erasure Coding&#xff0c;EC&#xff09; 两种方式实现。以下是对 Ceph 数据副本机制的全面解析&am…

【八股】Mysql中小厂八股

MySQL 基础 数据库三大范式&#xff08;中&#xff09; 第一范式: 要求数据库表的每一列都是不可分割的原子数据项 如详细地址可以分割为省市区等. 第二范式: 非主键属性必须完全依赖于主键, 不能部分依赖 第二范式要确保数据库表中的每一列都和主键相关, 而不能只与主键的某一…

怎么使用python查看网页源代码

使用python查看网页源代码的方法&#xff1a;1、使用“import”命令导入requests包import requests2、使用该包的get()方法&#xff0c;将要查看的网页链接传递进去&#xff0c;结果赋给变量xx requests.get(urlhttp://www.hao123.com)3、用“print (x.text)”语句把网页的内容…

C# 多线程:并发编程的原理与实践

深入探讨 C# 多线程&#xff1a;并发编程的原理与实践引言在现代应用开发中&#xff0c;性能和响应速度往往决定了用户体验的优劣。尤其在计算密集型或者IO密集型任务中&#xff0c;传统的单线程模型可能无法有效利用多核CPU的优势。因此&#xff0c;多线程技术成为了解决这些问…

react 常用组件库

1. Ant Design&#xff08;蚂蚁设计&#xff09;特点&#xff1a;国内最流行的企业级 UI 组件库之一&#xff0c;基于「中后台设计体系」&#xff0c;组件丰富&#xff08;表单、表格、弹窗、导航等&#xff09;、设计规范统一&#xff0c;支持主题定制和国际化。适用场景&…

Python 爬虫获取淘宝商品信息、价格及主图的实战指南

在电商数据分析、竞品调研或商品信息采集等场景中&#xff0c;获取淘宝商品的详细信息&#xff08;如价格、主图等&#xff09;是常见的需求。虽然淘宝开放平台提供了官方的 API 接口&#xff0c;但使用这些接口需要一定的开发和配置工作。本文将通过 Python 爬虫的方式&#x…

Ruby面向对象编程中类与方法的基础学习例子解析

代码示例&#xff1a; Ruby面向对象编程中类与方法的基础学习详细例子 1. 引言 在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;类是定义对象结构和行为的蓝图。Ruby是一种纯面向对象的编程语言&#xff0c;它将一切视为对象&#xff0c;包括基本数据类型。本文将…

[ Mybatis 多表关联查询 ] resultMap

目录 一. resultMap 1. 使用场景: 2. 查询映射: (1)单表查询映射: (2)多表查询映射: a. 在学生表里查专业 b. 在专业表里查学生 二. 其他注意事项 1. 插件下载 2. #{ } 和 ${ }的区别 一. resultMap 1. 使用场景: (1)当数据库列名和java类中的属性名不同时,可⽤ r…

Rust 性能提升“最后一公里”:详解 Profiling 瓶颈定位与优化|得物技术

一、Profiling&#xff1a;揭示性能瓶颈的“照妖镜”在过去的一年里&#xff0c;我们团队完成了一项壮举&#xff1a;将近万核的 Java 服务成功迁移到 Rust&#xff0c;并收获了令人瞩目的性能提升。我们的实践经验已在《RUST练习生如何在生产环境构建万亿流量》一文中与大家分…

STM32H5 的 PB14 引脚被意外拉低的问题解析 LAT1542

关键字&#xff1a;STM32H5&#xff0c; GPIO 1. 问题现象 客户反馈&#xff0c;使用 STM32H523RET6 应用中配置了两个 IO 口&#xff0c;PC9 为输出模式&#xff0c;内部下拉&#xff1b;PB14 为输入模式&#xff0c;内部上拉。在程序中将 PC9 引脚输出高电平&#xff0c;结…

【办公自动化】如何使用Python让Word文档处理自动化?

在日常办公中&#xff0c;Word文档是最常用的文本处理工具之一。通过Python自动化Word文档操作&#xff0c;可以大幅提高工作效率&#xff0c;减少重复劳动&#xff0c;特别适合批量生成报告、合同、简历等标准化文档。本文将介绍几种常用的Python操作Word文档的方法&#xff0…

顺序表的总结及模拟实现

目录 一.线性表 二.顺序表 1.概念 2.结构 3.要实现的接口函数 三.模拟实现顺序表 1.定义出顺序表的基本结构 2.实现检查扩容功能 3.实现尾插 4.实现尾删 5.实现头插和头删 6.查找 7.修改 8.遍历 9.在指定位置插入和删除 四.顺序表的优缺点及思考 a.顺序表的弊端 …

Vue3 vs Vue2:全面对比与面试宝典

文章目录Vue3 vs Vue2&#xff1a;全面对比与面试宝典引言&#xff1a;Vue框架的进化之路一、核心架构对比二、响应式系统的革命Vue2的响应式&#xff1a;像老式监控摄像头Vue3的响应式&#xff1a;像智能AI监控系统三、API风格的进化Vue2的Options API&#xff1a;像填表格Vue…

Java Web开发:Session与Cookie详细入门指南

在Web开发中&#xff0c;状态管理是核心需求之一。本文将深入讲解Java中Session和Cookie的使用方法&#xff0c;帮助你掌握用户状态管理的核心技术。 一、Session与Cookie基础概念 特性SessionCookie存储位置服务器内存/持久化存储客户端浏览器安全性较高&#xff08;敏感数据…

HTTPS与CA证书:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;证书颁发机构&#xff0c;负责签发和管理数字证书&#xff0c;验证证书持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 协议的 HTTP&#xff0c;通过证书实现客户端与服务器的身份验证和数据加密。HTTPSHTTPSSL/TLS…