nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式,这里用的是js-xlsx库;

需求

有一个 xlsx 的文件,里面有几个不同的 sheet,需要读取这个表格中不同 sheet 的数据,并且为每个 sheet 生成对应的 json 文件。

例如有一个名为 template.xlsx 的文件,里面有两个sheet,分别为 错误码常见问题,需要分别读取这两个 sheet 的内容,生成两个名为 errorCode.jsonnormalQues.json 的文件。每个 json 文件中都是一个对象数组。

js-xlsx

文章比较长,可以直接拉到最后看最终代码。

首先,需要安装 xlsx 这个包:

npm install xlsx

文本使用的xlsx文件名为 template.xlsx , 内容如下:

在这里插入图片描述
在这里插入图片描述

转成json文件的过程

引入 xlsx 并读取本地文件

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理

const workBook = xlsx.readFile("template.xlsx",{}) // 获取整个xlsx文档

workBook包含的内容和属性非常多,下面只截图一部分:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取 xlsx 文件中所有的sheet的名称

console.log(workBook.SheetNames);

在这里插入图片描述

获取 xlsx 文件中所有的sheet的内容

cosnole.log(workBook.Sheets);

这样得到的sheets是包含所有sheet内容的一个对象,格式为:

在这里插入图片描述
在这里插入图片描述

转成json格式

const {Sheets,SheetNames} = xlsx.readFile("template.xlsx",{}) // 获取整个xlsx文档

let output = []

SheetNames.forEach(item => {
    const arr = xlsx.utils.sheet_to_json(Sheets[item])
    output.push(arr)
}) 

console.log(output)

这时会发现输出output后,得到的是这样的一个数组:
在这里插入图片描述

这是因为 xlsx.utils.sheet_to_json 中可以传入一些参数,通过这些参数来控制不同的输出:

在这里插入图片描述
(图片来源:js-xlsx 使用总结 实现前端解析excel

针对我们的需求,在这里,我们可以给每行数据加一个表头,再给 xlsx.utils.sheet_to_json 函数加一个 { header: 2 } 的参数就可以达到想要的效果了。不同参数的效果可以参考这篇文章:xlsx.utils.sheet_to_json中header属性的研究

所以我们把刚才的表格改成这样,给它加一个表头,注意这里的表头就是后面生成的 json 文件中每个对象的属性名了。
在这里插入图片描述
在这里插入图片描述

代码上加入参数:

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理

const {Sheets,SheetNames} = xlsx.readFile("template.xlsx",{}) // 获取整个xlsx文档

let output = []

SheetNames.forEach(item => {
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{ header: 2 })
    output.push(arr)
}) 

console.log(output)

这时得到的结果如下图,可以看到这时生成了一个二维数组,上面部分是 错误码 sheet 的输出,下面是 常见问题 sheet 的输出。

在这里插入图片描述

生成JSON文件

进行到这一步,json 文件格式已经正确了,接下来我们需要把每个 sheet 对应的数组放到相应的 json 文件中。可以使用 fs 库来生成 json 文件。

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理
const fs = require("fs");

const {Sheets,SheetNames} = xlsx.readFile("template.xlsx",{}) // 获取整个xlsx文档

SheetNames.forEach(item => {
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{ header: 2 })

    let outputFileName = "";

    switch (item) {
        case "错误码":
            outputFileName = "errorCode"
            break;

        case "常见问题":
            outputFileName = "normalQues"
            break;
    
        default:
            break;
    }

    //定义输出文件路径
    fs.writeFile(`${outputFileName}.json`, JSON.stringify(arr, '' , ''), (err) => {
        if (err) {
            console.log(err)
        } else {
            console.log(`${outputFileName}.json 创建成功!!!`)
        }
    })
}) 

在这里插入图片描述

这时,在同一目录下,生成了对应的两个 json 文件,已经得到了我们想要的输出,需求已经实现了。

在这里插入图片描述

在这里插入图片描述

PS:如果之前有重名的文件,或者之前已经运行过一遍生成了两个json文件,再次运行代码时,不会因为之前存在这两个json文件就报错,而是会覆盖之前文件的内容。

在这里插入图片描述

额外设置

如果不想在同级目录下生成 JSON 文件,可以通过 path 设置不同的目录:

	const path = require("path")
	......
	
    //定义输出文件路径
    const outputFile = path.join(__dirname, `output/${outputFileName}.json`)
    fs.writeFile(outputFile, JSON.stringify(arr, '' , ''), (err) => {
        if (err) {
            console.log(err)
        } else {
            console.log(`output/${outputFileName}.json 创建成功!!!`)
        }
    })

在这里插入图片描述

但是要最注意:必须要保证 output 文件夹在运行程序前是存在的,不然会报错:

在这里插入图片描述

最终代码

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理
const fs = require("fs");
const path = require("path")

const {Sheets,SheetNames} = xlsx.readFile("template.xlsx",{}) // 获取整个xlsx文档

SheetNames.forEach(item => {
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{ header: 2 })

    let outputFileName = "";

    switch (item) {
        case "错误码":
            outputFileName = "errorCode"
            break;

        case "常见问题":
            outputFileName = "normalQues"
            break;
    
        default:
            break;
    }

    //定义输出文件路径
    const outputFile = path.join(__dirname, `output/${outputFileName}.json`)
    fs.writeFile(outputFile, JSON.stringify(arr, '' , ''), (err) => {
        if (err) {
            console.log(err)
        } else {
            console.log(`output/${outputFileName}.json 创建成功!!!`)
        }
    })
}) 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nodejs是一种非常流行的JavaScript运行时环境,它允许JavaScript代码在服务器端运行。在Nodejs中,我们可以使用fs模块来读取和操作文件,包括JSON文件。 要读取JSON文件,我们可以使用fs模块的readFile方法。首先,我们需要将JSON文件的路径作为参数传递给该方法。然后,我们需要指定一个回调函数,该函数将接收两个参数:错误对象和文件内容。如果读取文件时出现错误,错误对象将不是null,否则文件内容将被传递给回调函数。 一旦我们读取了JSON文件,我们可以将其解析为JavaScript对象。为此,我们可以使用JSON对象的parse方法。该方法需要接收一个JSON字符串作为参数,并返回一个JavaScript对象。 以下是一个简单的Nodejs程序,演示了如何读取和解析JSON文件: ```javascript const fs = require('fs'); fs.readFile('data.json', 'utf8', (err, data) => { if (err) throw err; const jsonData = JSON.parse(data); console.log(jsonData); }); ``` 上述代码中,我们首先使用require语句引入了fs模块。接下来,我们使用fs.readFile方法读取名为data.jsonJSON文件。'utf8'参数指定了我们希望读取文本文件,并将文件内容作为字符串返回。 读取文件后,我们使用JSON.parse方法将文件内容解析为JSON对象,并将其打印到控制台。注意,在实际开发中,我们可能需要根据具体应用场景对该代码进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charonmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值