NodeJs实现脚本:将xlxs文件输出到json文件中

文章目录

    • 前期工作和依赖
    • 笔记
    • 功能
    • 代码
    • 输出

最近有一个功能,将json文件里的内容抽取到一个xlxs中,然后维护xlxs文件。当要更新json文件时,就更新xlxs的内容并把它传回json中。这个脚本主要使用NodeJS写。

以下是完成此功能时做的一些笔记。

前期工作和依赖

js文件中要使用import,因此需要在package.json中设置:"type": "module"

依赖:

import xlsx from 'xlsx';
import path, { dirname } from 'node:path';
import fs from 'node:fs';
import { fileURLToPath } from 'node:url';
import md5 from 'blueimp-md5';

相关文档:
API 参考 | SheetJS 中文网 (nodejs.cn)
xlsx - npm (npmjs.com)

笔记

获取此文件目录名:

const __dirname = dirname(fileURLToPath(import.meta.url));

组合文件名:

const outPath = path.join(__dirname, './fileName.xlsx');

读取一个目录下的所有文件名:

const files = fs.readdirSync(dirName);

读取一个文件:

const enJson = fs.readFileSync(fileName, 'utf8');

将二维数组转换为xlxs工作表:

const sheet = xlsx.utils.aoa_to_sheet(sheetData);

将工作表添加到工作簿:

xlsx.utils.book_append_sheet(workBook, sheet, sheetName);

将工作表输出到xlsx文件中:

xlsx.writeFile(workBook, outPath, { bookType: 'xlsx' });

将数组输出到xlxs:data是数组。

const sheet = xlsx.utils.json_to_sheet(data); //将 JS 对象数组转换为工作表
const workBook= xlsx.utils.book_new();// 创建一个工作簿对象
xlsx.utils.book_append_sheet(workBook, sheet, 'sheetName'); // 将工作表添加到工作簿:
xlsx.writeFile(workBook, path, {bookType: 'xlsx',
}); // 输出到xlsx

功能

维护一个xlsx文档,里面包含国际化的所有翻译,如下:第一行 为 语言

enkojafr
英文翻译韩文翻译日文翻译法文翻译

有英文json翻译文件如下:src/locales/en/fileName1.json

其中key值为i18n的标记,value值为对应的翻译。

{"inviter": "Inviter","worth": "Worth ${{value}}","countDownTips": "Rewards Countdown"
}

默认语言为英语,我们需要以它为例子生成对应的其他语言文件,如生成:src/locales/fr/fileName1.json

{"inviter": "法文翻译1","worth": "法文翻译2","countDownTips": "法文翻译3"
}

所有的翻译都在xlsx中。因此我们需要读取xlsx文件,遍历src/locales/en下的对应文件(参数pageNames),将对应翻译生成到对应文件夹。若无对应翻译,则用英文兜底。

中途使用md5加密后的en翻译为key,将对应xlsx文件中的翻译(那一行)保存到set中,是因为xlsx中没有i18n标记,只有各语言翻译

将xlsx翻译文件输出到locales/[language]/[fileName]的功能封装成一个函数,参数如下:

读入的en文件夹上级为pagePath
参数:
pageNames:要维护的文件名列表,如 invite 对应locale/en/invite
filePath:xlsx文件路径
pagePath:locale文件路径
option:选项,包括
- outputKey:输出为json的某一个key值的value,没有就不填 (这个功能的代码很死板,像是硬编码,需求如此,先写着!)
- languageArray:传入一个数组,包含要求的语言,没有就不填,会默认xlsx里的所有文件

参数填错了就会报错,这个代码的健壮性并不强,只是一个加快工作效率的工具 / 练手代码。 所以建议严格按照参数要求调用函数。不要做那种:“没有outputKey应该不传,但我就传个空串”,可能会报奇怪的错误!

代码

// 入口
import xlsx from "xlsx";
import md5 from "blueimp-md5";
import fs from "node:fs";
import path from "node:path";// 删去前后空格 特判str为undefined
const trim = (str) => (str || "").replace(/^\s+|\s+$/g, "");// 生成一个set,key是en的翻译,value是对应row
function transSheetToMap(sheetData) {const map = new Map();for (const row of sheetData) {const key = md5(trim(row.en));map.set(key, row); // 加密后en的value为key,整个row为value}return map;
}/*
读入的en文件夹上级为pagePathpageNames:要维护的文件名列表,如 invite 对应locale/en/invite 
filePath:xlsx文件路径
pagePath:locale文件路径
option:选项,包括- outputKey:输出为json的某一个key值的value,没有就不填- languageArray:传入一个数组,包含要求的语言缩写,没有就不填,会默认xlsx里的所有文件
*/
function xlsxToJson(pageNames, filePath, pagePath, option) {let outputKey = undefined;if (option.outputKey) {outputKey = option.outputKey;}const workBook = xlsx.readFile(filePath);const firstWorksheet = workBook.SheetNames[0]; // 全都放在第一个sheet中const sheet = workBook.Sheets[firstWorksheet];const sheetData = xlsx.utils.sheet_to_json(sheet); // 数组,每个项是对象,key为语言value为翻译const languages = option.languageArray? option.languageArray: Object.keys(sheetData[0]); // 所有语言const dictions = transSheetToMap(sheetData);for (const pageName of pageNames) {// 英文文件const pageEnJson = JSON.parse(fs.readFileSync(path.join(pagePath, "en", `${pageName}.json`),"utf8"));// key 为 i18n标记const pageEnKeys = outputKey? Object.keys(pageEnJson[outputKey]): Object.keys(pageEnJson);for (const language of languages) {// 深拷贝英文样本const translatedJson = JSON.parse(JSON.stringify(pageEnJson));// translatedJson生成为对应语言,en兜底for (const key of pageEnKeys) {const translatedKey = outputKey? md5(trim(pageEnJson[outputKey][key])): md5(trim(pageEnJson[key]));const translation = dictions.get(translatedKey);if (outputKey) {translatedJson[outputKey][key] =translation[language] || translation["en"];} else {translatedJson[key] =translation[language] || translation["en"];}}const filePath = path.join(pagePath, language, `${pageName}.json`);// 若文件夹不存在则创建if (!fs.existsSync(path.join(pagePath, language))) {fs.mkdirSync(path.join(pagePath, language));}fs.writeFileSync(filePath, JSON.stringify(translatedJson, null, 4));}}
}export default xlsxToJson;
xlsxToJson(["invite", "player"],"C:/Users/somePath/i18n-all.xlsx","C:/Users/somePath/locales",{outputKey: "key",languageArray: ["de"],}
);

输出

调用:要翻译的文件为invite,输出到json文件的key属性中,只翻译到de德文。

xlsxToJson(["invite"],"C:/Users/somePath/i18n-all.xlsx","C:/Users/somePath/locales",{outputKey: "key",languageArray: ["de"],}
);

对应英文json如下:(有outputKey一定要填!没有的话一定不填!不然输出会很奇怪。)

// locales/en/invite.json
{"key": {"ogDesc": "Download Now!","inviter": "Inviter"}
}

结果输出locales/de/invite.json

在这里插入图片描述

可能会封装一个npm包,可能会维护。笔记先写在这吧!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle EBS AP发票创建会计科目错误:子分类帐日记帐分录未按输入币种进行平衡

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 提交“创建会计科目”请求提示错误信息如下: 中文报错: 该子分类帐日记帐分录未按输入币种进行平衡。请检查日记帐分录行中输入的金额。 英文报错:The subledger journal entry does not balance i…

11 IP协议 - IP协议头部

什么是 IP 协议 IP(Internet Protocol)是一种网络通信协议,它是互联网的核心协议之一,负责在计算机网络中路由数据包,使数据能够在不同设备之间进行有效的传输。IP协议的主要作用包括寻址、分组、路由和转发数据包&am…

【Python教程】1-注释、变量、标识符与基本操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记,稍微整理一下,分享出来,方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术,最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行实例分割

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 EISeg 工具进行标注,然后使用 eiseg2yolov8 脚本将.json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容如下…

【UML用户指南】-05-对基本结构建模-类

目录 1、名称(name) 2、属性 (attribute) 3、操作(operation) 4、对属性和操作的组织 4.1、衍型 4.2、职责 (responsibility) 4.3、其他特征 4.4、对简单类型建模 5、结构良…

【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera

本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 Google 官方介绍文档: https://source.android.google.cn/docs/core/camera/external-usb-cameras?hlzh-…

【传知代码】DETR[端到端目标检测](论文复现)

前言:想象一下,当自动驾驶汽车行驶在繁忙的街道上,DETR能够实时识别出道路上的行人、车辆、交通标志等目标,并准确预测出它们的位置和轨迹。这对于提高自动驾驶的安全性、减少交通事故具有重要意义。同样,在安防监控、…

Proxyman 现代直观的 HTTP 调试代理应用程序

Proxyman 是一款现代而直观的 HTTP 调试代理应用程序,它的功能强大,使您可以轻松捕获、检查和操作 HTTP(s) 流量。不再让繁杂的网络调试工具阻碍您的工作,使用 Proxyman,您将轻松应对网络调试的挑战。 下载地址:https…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作:SD卡烧录工具入门书籍推荐:BeagleBone cookbookBeagleBon cookbook 例程BeagleBone概况?BeagleBone 官方管理仓库(原理图,官方例程。。。)…

IP纯净度是什么,对用户有多么重要?

在网络应用和数据采集等领域,代理IP被广泛使用,而代理IP的纯净度则直接影响其性能和可用性。代理IP的纯净度主要涉及到代理IP在网络传输过程中的稳定性、匿名性和安全性。今天就带大家一起了解代理IP纯净度对用户的重要性。 第一,保护用户的隐…

http和https数据传输与协议区分

目录 1. 数据传输安全性2. 端口号3. URL 前缀4. SSL/TLS 证书5. 性能6. SEO 和用户信任7. 应用场景总结 HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端(如浏览器&…

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手,它可以自动生成代码,提升开发效率,帮您调试 Bug,节省您的时间,另外还可以对话聊天,解决您编程碰到的问题。 前一篇文章学习了 PyCharm…

项目管理--领导者vs管理者

项目管理领导者和管理者,虽然这两个角色在项目管理中都非常重要,但它们之间还是存在一些区别。首先,让我们来了解一下这两个角色的定义和职责。项目管理领导者是指那些能够激励团队成员,带领他们朝着共同目标前进的人。他们具备良…

高防CDN是如何应对DDoS和CC攻击的

高防CDN(内容分发网络)主要通过分布式的网络架构来帮助网站抵御DDoS(分布式拒绝服务)和CC(挑战碰撞)攻击。 下面是高防CDN如何应对这些攻击的详细描述: 1. DDoS攻击防护 DDoS攻击通过大量的恶…

【ArcGIS微课1000例】0119:TIFF与grid格式互相转换

文章目录 一、任务描述二、tiff转grid三、grid转tif四、注意事项一、任务描述 地理栅格数据常用TIFF格式和GRID格式进行存储。TIFF格式的栅格数据常以单文件形式存储,不仅存储有R、G、B三波段的像素值,还保存有地理坐标信息。GRID格式的栅格数据常以多文件的形式进行存储,且…

PDF编辑与转换的终极工具智能PDF处理Acrobat Pro DC

Acrobat Pro DC 2023是一款功能全面的PDF编辑管理软件,支持创建、编辑、转换、签署和共享PDF文件。它具备OCR技术,可将扫描文档转换为可编辑文本,同时提供智能PDF处理技术,确保文件完整性和可读性。此外,软件还支持电子…

使用 Scapy 库编写 ICMP 不可达攻击脚本

一、介绍 ICMP不可达攻击是一种利用ICMP(Internet Control Message Protocol)不可达消息来干扰或中断目标系统的网络通信的攻击类型。通过发送伪造的ICMP不可达消息,攻击者可以诱使目标系统认为某些网络路径或主机不可达,从而导致…

k8s小型实验模拟

(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。(5分) (2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPat…

netty+springboot+vue聊天室(需要了解netty)

先看看这个使用websocket实现的聊天室,因为前端是使用websocket,和下面的demo的前端差不多就不解释实现原理,所以建议还是看看(要是会websocket的大佬请忽略) springbootwebsocketvue聊天室 目录 一、实现内容二、代码实现1.后端2.前端源码…

k8s-部署对象存储minio

环境信息 minio版本 :最新 k8s 版本1.22 使用nfs作为共享存储 一.单节点安装包部署 脚本部署,一键部署,单节点应用于数据量小,一些缓存存储,比如gitlab-runner的产物数据,maven的打包依赖数据 #!/bin/bash# 步骤…