• 在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
    
    • 1

    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);
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这段代码中,我们使用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);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这段代码中,我们使用工作表对象的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});
    }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在此代码中,我们使用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 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    优化代码:
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在优化代码中:

    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');
    
    • 1
    • 2
    • 3

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

    结论

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

  • 相关阅读:
    k8s 部署filebeat sidecar模式之nginx测试
    cas单点登录原理与实现(整合springsecurity)
    1.计算机系统概述-王道考研计算机组成原理
    Fourier傅里叶变换的线性性质和位移性质
    rsync远程同步
    Redis List常用命令
    vue里使用elementui的级联选择器el-cascader进行懒加载的怎么实现数据回显?
    使用Apache Kafka 构建实时数据处理应用
    移动端使用vantUI的list组件,多个tab项来回切换时,列表加载多次导致数据无法正常展示
    手把手教你安装 Linux Mint系统
  • 原文地址:https://blog.csdn.net/qq_42880714/article/details/134356035