vue excel轉json功能 xlsx

在這里插入圖片描述

需求:

  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…