在nodejs
中不使用过多内存的情况下,将大型excel
文件转换为json
格式是一个非常常见的需求,因为它可以更容易地处理和共享数据。在这篇文章中,我们将探讨如何完成这个需求,提供一个逐步的指导和实用的提示。
JSON
是一种轻量级的数据格式,易于读写。它广泛用于不同系统之间的数据交换。特别是在Web
应用中。JSON
数据存储在键值对中,并表示为对象或数组。
excel
文件通常用于数据分析,但是JSON
是数据交换的理想格式。JSON
文件的规模比excel
文件小,因此更易于共享和存储。JSON
文件也可以用于Web
应用程序和API
。
我们将使用nodejs
和几个库以一种使用较少内存的方式将大型excel
文件转换为JSON
。
我们需要安装几个库来处理excel
和JSON
文件。我们可以使用以下命令安装这些库:
npm install exceljs jsonfile
exceljs
是一个用于读取和编写excel
文件的库。jsonfile
是一个用于读写JSON
文件的库。
我们可以使用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
文件中提取数据。
我们可以使用工作表对象从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数组。
我们可以使用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
数据。
我们可以将先前的代码包在一个函数中,使其具有可重用性。我们可以使用下列代码来定义转换的函数:
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 };
在优化代码中:
worksheet.eachRow()
方法改为worksheet.getSheetValues()
.此更改允许通过一次检索所有表值,而不是单独处理每一行,从而提高内存效率。row.eachCell()
方法改为使用一个简单的for...of
循环来迭代每一行的单元格。这种修改减少了不必要的函数调用并提高了性能。jsonfile.writeFile()
里的回调函数删除,使用Promise
。可以使用try...catch
块并提供更简明易读的代码结构.通过应用这些优化,我们可以减少内存的使用,并提高excel
对JSON
转换过程的性能。此外,使用await
与readFile()
和writeFile()
方法确保代码在不阻塞事件循环的情况下异步执行。
记住处理在文件读取、写入或解析过程中可能发生的任何错误,以确保在应用程序中进行稳健的错误处理。
我们可以从另一个模块调用转换器。我们可以使用下列代码来调用该函数:
const { convertExcelToJson } = require('./convert');
convertExcelToJson('excel_file.xlsx', 'json_file.json', 'Sheet1');
在此代码中,我们需要导出转换的模块。然后我们用输入文件、输出文件和表名参数调用该函数。
在本文中,我们展示了如何在不使用过多的内存的情况下将大型excel
文件转换为JSON
。我们使用exceljs
库来将excel
文件加载到一个工作表对象中,从工作表中提取数据,并使用jsonfile
库将其转换为一个JSON
对象。我们还定义了一个函数,使代码具有可重用性,并演示了如何从另一个模块调用函数。通过遵循这些步骤,我们可以高效和有效地将大型excel
文件转换为JSON
。