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

news/2024/11/29 22:47:59/

在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.ppmy.cn/news/1212370.html

相关文章

IDEA搭建ssm项目

此前,我一直在用eclipse编辑器做java项目,现在初次使用IDEA编辑器,在这里,我记录了使用IDEA环境下搭建ssm项目的过程。 创建Maven项目,如下 右击TEST4项目,在弹出的菜单中选择Add Framework Support 在弹出…

spring validation,自定义校验时间注解

广告: 话费充值优惠公众号: 惠享乐生活服务 前言: 前端传入的时间需要小于当前时间,因此想到了通过自定义注解实现,就无需在代码中写校验逻辑了。 1. 创建LocalDateTimeRange注解 package com.luck.living.validation;import …

基于STM32单片机抢答器设计

**单片机设计介绍, 基于STM32单片机抢答器设计-Proteus仿真 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于STM32单片机的抢答器设计可以用于教育和培训场景中的抢答游戏或考试环节。以下是一个基本的介绍设计步骤…

Linux 设置静态IP(Ubuntu 20.04/18.04)

以Ubuntu20.04示例 第一步:查看当前网络信息 ifconfig 本机网卡名为:ens32,IP地址为:192.168.15.133,子网掩码为:255.255.255.0 第二步:查看当前网关信息 route -n 网关地址为:1…

Linux学习教程(第二章 Linux系统安装)3

第二章 Linux系统安装 十一、Linux远程管理协议(RFB、RDP、Telnet和SSH) 提到远程管理,通常指的是远程管理服务器,而非个人计算机。个人计算机可以随时拿来用,服务器通常放置在机房中,用户无法直接接触到…

Spring Bean循环依赖问题及解决

什么是循环依赖 类与类之间的依赖关系形成了闭环,就会导致循环依赖问题的产生。举例来说,假设存在两个服务类A和服务类B,如果A通过依赖注入的方式引用了B,且B通过依赖注入的方式引用了A,那么A和B之间就存在循环依赖。…

postgreSQL中的TOAST技术

摘要:介绍postgreSQL中的TOAST技术 ​ TOAST(The Oversize-Attribute Storage Technique)技术是PG提供的一种存储大数据的机制。 ​ 要理解TOAST,我们要先理解页(BLOCK)的概念。在PG中,页是数据…

【数据结构初阶】顺序表SeqList

描述 顺序表我们可以把它想象成在一个表格里面填数据,并对数据做调整; 那我们的第一个问题是:怎么样在创建出足够的空间呢? 我们可以去堆上申请,用一个指针指向一块空间,如果申请的空间不够,我…