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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道,双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具,用于在Linux/UNIX 下对文本和数据进行处理。数据…

ChatGPT vs. Bing vs. Bard

随着 2022 年 ChatGTP 的推出,人工智能聊天机器人的世界突然走上了一条新道路。如今,密切关注 AI 的人都知道,不同公司推出了几款产品。从谷歌拥有自己的 Bard AI,到微软发布新的 Bing AI Chat,再到 OpenAI 发布GPT-4。…

用gost实现远程端口映射

gost 是一个非常优秀的tunnel. 支持多种形式的端口映射。 本文只介绍远程端口映射方式的tunnel. 远程端口映射的意思就是,将本地端的某个服务的端口A(tcp/udp)映射到远程的某个端口P上, 用户通过访问远程的端口P来访问本地端的这…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师(副教授):来自国内重点高校,长期从事涡度通量观测与分析研究,发表SCI论文多篇,主持国家与地方科研项目多个,在生态环境数据处理与分析中具有丰富的实…

Fourier分析入门——第3章——离散函数的Fourier分析

目录 第 3 章 离散函数的Fourier分析 3.1 引言 3.2 在1点采样的函数 3.3 在2点采样的函数 3.4 Fourier分析是一种线性变换 3.5 Fourier分析是一种基向量的变更 3.6 在3点采样的函数 3.7 在D点采样的函数 3.8 整理(tidying up) 3.9 Parseval[p:zeifa:l]定理 3.10 关联…

【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。

文章目录 一、题目二、解答:迭代法,引入一个新的头结点三、难点解释 【LeetCode】203,移除链表元素。 难度等级:简单。 本题是链表入门题目,值得深入研究。 一、题目 二、解答:迭代法,引入一个…

Spring实现IOC和DI入门案例(XML版)

文章目录 1 IOC入门案例(XML版)1.1 思路分析1.2 代码实现步骤1:创建Maven项目步骤2:添加Spring的依赖jar包步骤3:添加案例中需要的类步骤4:添加spring配置文件步骤5:在配置文件中完成bean的配置步骤6:获取IOC容器步骤7:从容器中获取对象进行方法调用步骤8:运行程序 2 DI入门案例…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意: 思路: 一开始手玩了一下 如果不是高低高的形式,那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置,O(1)计…

ShardingSphere-JDBC整合SpringBoot JPA读写分离失败

问题 最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。 在查阅各种资料后,初步确定未JPA事务问题 ShardingSphere负载均衡算法 我当前使用的版本是…

【历史上的今天】4 月 23 日:YouTube 上传第一个视频;数字音频播放器的发明者出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 4 月 23 日,世界读书日。在 1564 年的这一天,全世界最卓越的文学家之一莎士比亚出生;1616 年的这一天,莎士比亚…

shell脚本5数组

文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…

现在的00后,实在是太卷了,我们这些老油条都想辞职了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪20K,都快要超过我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家…

真题详解(传引用)-软件设计(七十五)

真题详解(补码转换)-软件设计(七十四)https://blog.csdn.net/ke1ying/article/details/130674214 分治算法技术设计______。 答案:1、问题划分 2、递归求解 3、合并解 虚拟存储体系_____两级构成。 解析:主存 和 辅…

linux环境安装使用tomcat详解

01-安装Tomcat # 0.下载tomcat http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.46/bin/apache-tomcat-8.5.46.tar.gz # 1.通过工具上传到Linux系统中 # 2.解压缩到/usr目录中 [rootlocalhost ~]# tar -zxvf apache-tomcat-8.5.46.tar.gz -C /usr/ -C 用来指…

【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

今天起,由 Midjourney 打头阵,让我们开始共同探索一系列的 AI 领域革命性作品,包括 Midjourney、Stable Diffusion、ChatGPT 等等,学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。相较于市面上琳琅满目的…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。 经典以太网:是以太网的原始形式,运行速度从 …

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制)

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制) 目录 应用背景操作步骤1、宏的录制启用2、宏的使用3、宏的保存4、宏的禁用 应用背景 宏是一个自动化完成重复性工作的工具,使用宏可以提高我们的工作效率,那应该怎样使用宏这一…

ArcSWAT报错:Error Number :-2147467259; 对 COM 组件的调用返回了错误 HRESULT E_FAIL

文章目录 1 报错内容2 报错解决3 并行处理的设置补充说明 1 报错内容 通常为连续两段报错: Error Number :-2147467259 Error Message :对 COM 组件的调用返回了错误 HRESULT E_FAIL 。 Module name : mSWFlow Function name : createStream Procedure ( error li…

chatgpt赋能Python-python3_5如何安装

Python3.5安装指南 Python是一种高级编程语言,它广泛用于Web开发、数据分析、机器学习等领域。在Python的众多版本中,Python3.5是最常用的版本之一。如果你正在考虑学习Python3.5或者需要使用Python3.5进行项目开发,那么接下来的安装指南将会…

第十三章 使用DHCP动态管理主机地址

文章目录 第十三章 使用DHCP动态管理主机地址一、动态主机地址管理协议1、DHCP简介2、DHCP常见术语 二、部署DHCP服务程序1、安装DHCP服务程序2、配置文件参考模板3、dhcpd服务程序配置文件中常见参数及作用 三、自动管理IP地址1、机房所用的网络地址以及参数信息2、关闭虚拟网…