nodejs处理xlsx文件生成json文件

news2025/1/20 3:57:23

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 创建成功!!!`)
        }
    })
}) 

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

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

相关文章

草根测试员的涨薪之路:我是如何从0到月薪20K的?(仅供借鉴)

我是一名转IT测试人,我的专业是化学,去化工厂实习才发现这专业的坑人之处,化学试剂害人不浅,有毒,易燃易爆,实验室经常用丙酮,甲醇,四氯化碳,接触多了,吃个饭…

网络安全:Hydra 端口爆破工具.(九头蛇)

网络安全:Hydra 端口爆破工具.(九头蛇) Hydra 也叫九头蛇,是一款开源的暴力PJ工具,集成在kali当中。可以对多种服务的账号和密码进行爆破,包括 Web 登录、数据库、SSH、FTP 等服务. 目录: 网络…

内网渗透—域防火墙策略同步、不出网隧道上线

内网渗透—域防火墙策略同步、不出网隧道上线 1. 前言2. 域防火墙2.1. 域控开启防火墙同步测试2.1.1. 查看域主机防火墙策略2.1.2. 域控防火墙策略下发同步2.1.2.1. 创建组策略2.1.2.2. 编辑组策略2.1.2.3. 编辑防火墙2.1.2.4. 同步防火墙策略 2.2. 域控出入站规则同步2.2.1. 查…

【数据结构】队列及其实现

目录 😎前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 😎前言 上次我们学习了栈及其实现,当然也少不它的好兄弟队列啦,今天我们开始队列的学习队…

大模型Founation Model

一、背景 自从chatgpt,gpt4以特别好的效果冲入人们的视野中,也使得AI产业发生了巨大变革,从17年以来的bert,将AI的各种领域都引入bert类的fine-tune方法,来解决单个领域单个任务的一一个预训练模型。在学术界和工业界…

Redis---事务管道

目录 一、Redis的事务是什么? 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务? 2.1 正常执行: 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢?我们首先来看一…

前后端分离项目部署上线流程-和错误解决

需求:就是想把自己写的前后端项目传上去不再是只有本地可以访问,其他人也可以访问我这个项目,以此记录免得后面搞忘了,文章很长,也很细,我自己上线碰到的错误也会发一下,建议看完哦 1.首先买个…

U盘连接电脑不显示怎么办?

对于很多Windows 11/10/8/7系统下的用户,U 盘、SD卡或其他移动硬盘未检测到或磁盘管理中不显示,这是一个非常普遍的问题。下面我们就来了解一下出现这种情况的常见原因和解决办法。 为什么U盘没有显示在磁盘管理中? U盘在电脑磁盘管理中不显…

GPT专业应用:生成实习报告

正文共 1070 字,阅读大约需要 4 分钟 大学生必备技巧,您将在4分钟后获得以下超能力: 快速生成实习报告 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由…

旅游网站设计方案

针对涉旅企业的旅游网站设计,主要要考虑以下几点: 1、考虑网站的业务开展需求,能够有效将衣、食、住、行、游、购、娱融合在一起,满足旅游企业的业务开展需求。 2、网站的设计结构,符合目前的网站开发结构,…

vue3鼠标经过显示按钮

在前端开发中,我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮,这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中,我将会介绍如何使用 Vue3 实现一个鼠标经过显…

七人拼团系统开发模式常见问题详解

七人拼团模式最近在市场上非常火爆,很多企业商家都在用这个模式。但同时也有很多人对这个模式不太了解,纷纷私信问我,今天就在这里简单说一下七人拼团模式的常见问题。 1、什么是七人拼团? 七人拼团就是用户购买专区礼包后&#…

Redis的数据类型

参考文档:https://www.runoob.com/redis/redis-tutorial.html redis当中一共支持五种数据类型,分别是: string字符串 list列表 set集合 hash表 zset有序集合 1、对字符串string的操作 下表列出了常用的 redis 字符串命令 1 设置值 获取…

报错:To install it, you can run : npm install --save @api/***解决方法

启动项目时,控制台报错,在此记录一下 以下是报错原因: 报错信息如下 To install it, you can run: npm install --save /api/tNursingStaffCirculation Proxy error: Could not proxy request auth/code from localhost:8013 to http://local. See ht…

【下载】【you-get】用电脑下载网页视频

分享一下,此方法是在网络上看到的,但忘了出处。 一、前提 电脑安装了python软件,版本无要求。建议上官网下载软件。记得配置好环境(将pyhton的scripts文件夹的路径加到用户变量里)。 二、方法 1、安装you-get库 &am…

本周精彩!关于 Linux 内核宕机和超融合 Kata 虚拟化容器技术介绍 | 第 77-78 期

本周「龙蜥大讲堂」预告来啦!我们邀请了系统运维 SIG Contributor 刘馨蔚分享《Linux 内核宕机介绍和简单分析思路》,浪潮数据超融合云原生工程师王永超分享《超融合产品中的 Kata Containers》主题演讲,精彩多多,快来扫码入群&am…

linux0.12-9-1-总体功能

[395页] 9-1 总体功能 对硬盘和软盘块设备上数据的读写操作是通过中断程序进行的。内核每次读写的数据量以一个逻辑块(1024字节)为单位,而块设备控制器则是以扇区(512字节)为单位。在处理过程中,使用了读写请求项等待队列来顺序缓冲一次读写多个逻辑块…

测试用例常见的几种设计方法

我们将从以下几种常见的方法入手,讲解测试用例的设计方法: 基于需求的设计方法、等价类、边界值、因果图、正交排列、场景设计法、错误猜测法。 1.测试用例的基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一…

Android中AIDL的简单使用(Hello world)

AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 代码实现过程简述: A应用创建aidl接口,并且创建一个Service来实现这个接口&#xff08…

使用阿里云服务器

一、购买阿里云服务器(如果是学生可以免费体验几个月) 二、开启安全组: (开启安全组): 现在这台服务器是专用网络的,那这边的网卡类型的话就内网。如果您是一个经典网络的服务器,那…