在node中实现高效率、低内存的excel/JSON转换

在node中实现高效率、低内存的excel/JSON转换

nodejs中不使用过多内存的情况下,将大型excel文件转换为json格式是一个非常常见的需求,因为它可以更容易地处理和共享数据。在这篇文章中,我们将探讨如何完成这个需求,提供一个逐步的指导和实用的提示。

什么是JSON?

JSON是一种轻量级的数据格式,易于读写。它广泛用于不同系统之间的数据交换。特别是在Web应用中。JSON数据存储在键值对中,并表示为对象或数组。

为什么要把excel转换成JSON?

excel文件通常用于数据分析,但是JSON是数据交换的理想格式。JSON文件的规模比excel文件小,因此更易于共享和存储。JSON文件也可以用于Web应用程序和API

将大型excel文件转换为JSON的步骤。

我们将使用nodejs和几个库以一种使用较少内存的方式将大型excel文件转换为JSON

步骤1:安装所需的库

我们需要安装几个库来处理excelJSON文件。我们可以使用以下命令安装这些库:

npm install exceljs jsonfile

exceljs是一个用于读取和编写excel文件的库。jsonfile是一个用于读写JSON文件的库。

步骤1:加载excel文件

我们可以使用exceljs库来将excel文件加载到js对象中。我们可以使用以下代码来加载excel文件:

const ExcelJS = require('exceljs');
const workbook = new ExcelJS.Workbook();workbook.xlsx.readFile('excel_file.xlsx').then(() => {const worksheet = workbook.getWorksheet(1);// ...}).catch((error) => {console.log('Error: ', error);});

在这段代码中,我们使用exceljs库来将excel文件加载到js对象中。我们正在使用读文件方法来读取文件,然后使用getWorksheet方法从工作簿中获取第一个工作表。我们将使用这个工作表从excel文件中提取数据。

步骤3:将工作表转换为JSON

我们可以使用工作表对象从excel文件中提取数据并将其转换为JSON对象。我们可以使用以下代码将工作表转换为JSON对象:

const json = [];worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {const rowObject = {};row.eachCell({ includeEmpty: true }, function(cell, colNumber) {rowObject[`col${colNumber}`] = cell.value;});json.push(rowObject);
});

在这段代码中,我们使用工作表对象的EachLU方法对工作表中的每一行进行迭代。我们正在使用包含空参数在迭代中包含空单元格。对于每一行,我们正在使用Each槽方法来迭代行中的每个单元格。我们正在使用包含空参数在迭代中包含空单元格。对于每个单元格,我们将向列对象对象添加具有列号和单元格值的新属性。最后,我们将行对象对象推到JSON数组。

步骤4:保存JSON文件

我们可以使用jsonfile库将JSON对象保存到文件中。我们可以使用以下代码来保存JSON文件:

const jsonfile = require('jsonfile');
const outputFile = 'json_file.json';jsonfile.writeFile(outputFile, json, { spaces:4 }, function(err) {
if (err) {
console.error(err);
} else {
console.log(JSON file saved to ${outputFile});
}
});

在此代码中,我们使用jsonfile库将JSON对象保存到文件中。我们使用writeFile方法来编写文件。传递输出文件参数以指定输出文件的名称并传递JSON对象作为写入文件的数据。设置spaces: 4使用缩进格式格式化JSON数据。

步骤5:将代码包入函数

我们可以将先前的代码包在一个函数中,使其具有可重用性。我们可以使用下列代码来定义转换的函数:

const convertExcelToJson = (inputFile, outputFile, sheetName) => {const ExcelJS = require('exceljs');const jsonfile = require('jsonfile');const workbook = new ExcelJS.Workbook();workbook.xlsx.readFile(inputFile).then(() => {const worksheet = workbook.getWorksheet(sheetName);const json = [];worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {const rowObject = {};row.eachCell({ includeEmpty: true }, function(cell, colNumber) {rowObject[`col${colNumber}`] = cell.value;});json.push(rowObject);});jsonfile.writeFile(outputFile, json, { spaces: 4 }, function(err) {if (err) {console.error(err);} else {console.log(`JSON file saved to ${outputFile}`);}});}).catch((error) => {console.log('Error: ', error);});
};module.exports = { convertExcelToJson };
优化代码:
const convertExcelToJson = async (inputFile, outputFile, sheetName) => {const ExcelJS = require('exceljs');const jsonfile = require('jsonfile');const workbook = new ExcelJS.Workbook();try {await workbook.xlsx.readFile(inputFile);const worksheet = workbook.getWorksheet(sheetName);const json = [];for (const row of worksheet.getSheetValues()) {const rowObject = {};for (const [colNumber, cell] of row.entries()) {rowObject[`col${colNumber + 1}`] = cell;}json.push(rowObject);}await jsonfile.writeFile(outputFile, json, { spaces: 4 });console.log(`JSON file saved to ${outputFile}`);} catch (error) {console.error('Error:', error);}
};module.exports = { convertExcelToJson };

在优化代码中:

  1. worksheet.eachRow() 方法改为worksheet.getSheetValues() .此更改允许通过一次检索所有表值,而不是单独处理每一行,从而提高内存效率。
  2. row.eachCell() 方法改为使用一个简单的for...of 循环来迭代每一行的单元格。这种修改减少了不必要的函数调用并提高了性能。
  3. jsonfile.writeFile()里的回调函数删除,使用Promise。可以使用try...catch 块并提供更简明易读的代码结构.

通过应用这些优化,我们可以减少内存的使用,并提高excelJSON转换过程的性能。此外,使用awaitreadFile()writeFile() 方法确保代码在不阻塞事件循环的情况下异步执行。

记住处理在文件读取、写入或解析过程中可能发生的任何错误,以确保在应用程序中进行稳健的错误处理。

步骤6:调用函数

我们可以从另一个模块调用转换器。我们可以使用下列代码来调用该函数:

const { convertExcelToJson } = require('./convert');convertExcelToJson('excel_file.xlsx', 'json_file.json', 'Sheet1');

在此代码中,我们需要导出转换的模块。然后我们用输入文件、输出文件和表名参数调用该函数。

结论

在本文中,我们展示了如何在不使用过多的内存的情况下将大型excel文件转换为JSON。我们使用exceljs库来将excel文件加载到一个工作表对象中,从工作表中提取数据,并使用jsonfile库将其转换为一个JSON对象。我们还定义了一个函数,使代码具有可重用性,并演示了如何从另一个模块调用函数。通过遵循这些步骤,我们可以高效和有效地将大型excel文件转换为JSON

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

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

相关文章

Mac电脑Visio文件编辑查看软件推荐Visio Viewer for Mac

mac版Visio Viewer功能特色 在Mac OS X上查看Visio绘图和图表 在Mac OS X上轻松查看MS Visio文件 在Mac上快速方便地打开并阅读Visio文件(.vsd,.vsdx)。 支持通过放大,缩小,旋转,文本选择和复制&#xff0…

群晖Docker(Container Manager)中安装Home Assistant Container

群晖Docker(Container Manager)中安装Home Assistant Container 不要使用 套件里面的 Home Assistant,不利于后期拓展 方式一: docker run -d --name"home-assistant-1" -v /volume1/docker/homeassistant/config:/c…

秋招求职经验分享

0.个人简介 2023年10月底,最终拿到了海康威视、汇川技术等十余家公司的Offer,最终签了自己心仪的Offer,秋招对我来说算是正式结束了,写个博客纪念一下,顺便分享以下秋招的经验,为后来人求职提供一些参考。…

华东“启明”青少年音乐艺术实践中心揭幕暨中国“启明”巴洛克合奏团首演音乐会

2023年11月11日,华东“启明”青少年音乐艺术实践中心在上海揭幕,中国“启明”巴洛克合奏团开启了首场音乐会。 华东“启明”青少年音乐艺术实践中心由中共宁波市江北区委宣传部与上音管风琴艺术中心联合指导,宁波音乐港、宁波市江北区洛奇音乐…

Apache APISIX 的 Admin API 默认访问令牌漏洞(CVE-2020-13945)漏洞复现

漏洞描述 Apache APISIX 是一个动态、实时、高性能的 API 网关。Apache APISIX 有一个默认的内置 API 令牌,可用于访问所有 admin API,通过 2.x 版本中添加的参数导致远程执行 LUA 代码。 漏洞环境及利用 启动docker环境 访问9080端口 通过 admin api…

利用LangChain实现RAG

检索增强生成(Retrieval-Augmented Generation, RAG)结合了搜寻检索生成能力和自然语言处理架构,透过这个架构,模型可以从外部知识库搜寻相关信息,然后使用这些信息来生成response。要完成检索增强生成主要包含四个步骤…

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器

前言 JVM作为Java进阶的知识,是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清…

GetPrivateProfileSection使用

基本语法 GetPrivateProfileSection 是一个 Windows API 函数,用于检索指定 INI 文件中特定节的所有键值对。它可以读取INI文件中指定节所有的键值对并将结果存储在指定的缓冲区中。 以下是 GetPrivateProfileSection 函数的基本语法: DWORD GetPriva…

如何实现Debian工控电脑USB接口安全管控

Debian 作为工控电脑操作系统具有稳定性、安全性、自定义性和丰富的软件包等优势,适用于要求高度可靠性和安全性的工控应用。 Debian 作为工控电脑操作系统在工业控制领域有很大优势,包括: 稳定性:Debian 的发布版以其稳定性而闻…

find和grep命令的简单使用

find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径,可以是一个目录或文件名…

MS321V/358V/324V低压、轨到轨输入输出运放

MS321V/MS358V/MS324V 是单个、两个和四个低压轨到轨输 入输出运放,可工作在幅度为 2.7V 到 5V 的单电源或者双电源条件 下。在低电源、空间节省和低成本应用方面是最有效的解决方案。 这些放大器专门设计为低压工作( 2.7V 到 5V )…

Electron-vue出现GET http://localhost:9080/__webpack_hmr net::ERR_ABORTED解决方案

GET http://localhost:9080/__webpack_hmr net::ERR_ABORTED解决方案 使用版本解决方案解决总结 使用版本 以下是我解决此问题时使用的electron和vue等的一些版本信息 【附】经过测试 electron 的版本为 13.1.4 时也能解决 解决方案 将项目下的 .electron-vue/dev-runner.js…

为什么要用“交叉熵”做损失函数

大家好啊,我是董董灿。 今天看一个在深度学习中很枯燥但很重要的概念——交叉熵损失函数。 作为一种损失函数,它的重要作用便是可以将“预测值”和“真实值(标签)”进行对比,从而输出 loss 值,直到 loss 值收敛,可以…

相对路径和绝对路径

来源 绝对路径,从根目录为起点到某一个目录的路径; 相对路径,从一个目录为起点到另外一个的目录的路径。 例如: ┍ A文件夹 C -| ┕ B文件夹 绝对路径: C:\A文件夹 相对路径(如果你在A文件夹时&#xf…

【Objective-C】Objective-C汇总

方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…

Python .exe 打包工具

PyInstaller 是一个非常强大的 Python 包,用于将 Python 程序打包成可执行文件(.exe 文件)。下面是如何安装 PyInstaller 的详细教程: 步骤 1: 首先,打开你的命令行或终端窗口。 步骤 2: 确保…

Python数据结构:元组(Tuple)详解

1.介绍和基础操作 Python中的元组(Tuple)是不可变有序序列,可以容纳任意数据类型(包括数字、字符串、布尔型、列表、字典等)的元素,通常用圆括号() 包裹。与列表(List)类似&#xff…

擎创动态 | 再获上海区政府肯定,擎创科技被评为年度优秀高新技术企业

11月6日,上海市静安区副区长张慧和市北高新集团总裁陈军一行来到擎创科技调研指导,由擎创科技高管张健和陈莹陪同交流。 陈莹女士首先向副区长一行详细介绍了擎创科技的发展现状、落地实践效益以及未来的规划布局。在公司的成长过程中,得到静…

力扣labuladong——一刷day27

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣870. 优势洗牌 田忌赛马的升级版,nums1表示田忌的马,nums2表示齐王的马,nums2的下标表示出场顺序 前言 一、力扣870…

Windows 10 下使用Visual Studio 2017 编译CEF SDK

1.下载CEF SDK 由于需要跑在32位的机器,所以选择下载32位的SDKCEF Automated Builds 选择 Current Stable Build (Preferred) ,这是当前稳定版本,CEF版本118 下载成功解压 2.下载编译工具 CMake 下载地址:CMake 配置CMake指向…