使用nodejs实现JSON文件自动转Excel的工具(推荐)


Posted in NodeJs onJune 24, 2020

这段时间做项目,需要把json格式的文档给到业务人员去翻译,每次手动翻译,很麻烦,于是就想着写一个高逼格的自动化工具来完成这件事情。

说实现,初步思路就是使用类似"json2excel start"这样的命令,然后它就自己跑。像vue,react运行命令一样。

首先,我们 npm init 新建一个项目工程,新建我们项目的核心文件json2excel.js ,并运行node json2exce.js,然后控制台就可以打印东西了。

使用nodejs实现JSON文件自动转Excel的工具(推荐)

把一个文件转化成另一个文件,我们要知道这个文件的路径,以及保存到的位置,所以命令设计为:

json2excel start inpath outpath

我们使用一个非常好用的命令行辅助包"commander",提示命令输入,json2excel.js如下,

const program = require('commander')

// 定义当前的版本
program
 .version(require('../package').version)

// 定义命令方法
program
 .usage('<command> [inPath] [toPath]')
 
program
 .command('start [paths...]')
 .description('Conversion from JSON to csv')
 .alias('-s')
 .action(paths => require('./command/j2c')(paths))
 
program.parse(process.argv)

if (!program.args.length) {
 program.help()
}

然后运行node json2excel.js会看到(现在还没安装bin命令,所以用node json2excel代替json2excel),

使用nodejs实现JSON文件自动转Excel的工具(推荐)

非常哇瑟的一个操作,就可以看到命令引导提示了。

.command() 是定义命令及其后面的参数,我们定义了paths
.description() 是描述
.alias() 是命令的别名

.action() 是运行命令时要执行的操作,paths是command里面传过来的参数

我们新建../command/j2c.js,.action()的时候我们有接受命令参数

module.exports = (paths) => {
 // 这样就得到了输入、输出的路径了
 let [inPath, outPath] = paths
}

如果命令参数没有附带怎么办?

如: node json2excel start 不带路径然后就回车

那我们就引导用户再次输入,使用"co","co-prompt"这两个工具

上代码:../command/j2c.js

const co = require('co')
const prompt = require('co-prompt')

module.exports = (paths) => {
 co(function* () {
 let [inPath, outPath] = paths
 // 处理用户输入
 inPath = inPath ? inPath : yield prompt('Input file directory: ')
 outPath = outPath ? outPath : (yield prompt('Output file directory: ')) || inPath
 })
}

co里面接受generator函数,主要是异步操作作同步处理的写法。

运行 node json2excel start

使用nodejs实现JSON文件自动转Excel的工具(推荐)

这样就可以保证拿到输入输出的路径了,用户体验满分,棒棒的。

下一步, 通过拿到的输入路径,获取json文件 ,使用"glob"这个工具,通过正则匹配拿到inpath路径下所有的json文件

站在巨人的肩膀上做事,事半功倍,代码如下:

使用nodejs实现JSON文件自动转Excel的工具(推荐)

拿到json文件,我们就开始向Excel转换,csv是一种和json一样简单数据结构,我们把json转成csv的格式。

以下是json格式和csv格式的对比,这样去看,转换也不难。左边是json数据格式,右边是字符串,可以这么理解。

使用nodejs实现JSON文件自动转Excel的工具(推荐)

我们使用"json2csv"这个包,有时间的也可以自己转换拼接。

读取json文件并转换成scv:

const Json2csvParser = require('json2csv').Parser

for(let filename in files) {
 // 同步读取文件
 let jsonData = fs.readFileSync(files[filename])
 jsonData = JSON.parse(jsonData)

 // json2csv转换
 const fields = Object.keys(jsonData[0])
 const json2csvParser = new Json2csvParser({fields})
 const csvData = json2csvParser.parse(jsonData)

 // 写入的文件名
 const outputFileName = `${outPath}/${filename}.csv`

 // 写入文件
 const err = fs.writeFileSync(outputFileName, csvData)
 if(err) {
 return console.log(err)
 } else {
 console.log(`- ${filename}.json Conversion successful!`)
 }
}

使用nodejs实现JSON文件自动转Excel的工具(推荐)

运行后可以得到一个.csv的文件,一个简单的实现完成。

细节优化,并实现:

在office下会显示乱码,所以要定义为UTF-8的格式存储。

// office Excel需要 BOM 头来定义 UTF-8编码格式
const BOM = Buffer.from('\uFEFF')
const csvData = Buffer.concat([BOM, Buffer.from(csvData)])

如果输出路径不存在,存储也不会成功

// 不存在文件夹就创建
if(!fs.existsSync(outPath)) {
 fs.mkdirSync(outPath)
}

json格式数据,有对象形式的,也有数组形式的,如果是对象就转化成数组

// 如果是对象,把对象的每一个键值对,转化成'key', 'value'的数组项
let jsonData, fields
if(Object.prototype.toString.call(jsonData) === '[object Object]') {
 jsonData = Object.keys(jsonData).map(key => ({
 key: key,
 value: jsonData[key]
 }))
 fields = ['key', 'value']
}
if(Object.prototype.toString.call(jsonData) === '[object Array]') {
 jsonData = jsonData
 fields = Object.keys(jsonData[0])
}

存储成功显示文件存储的路径,并退出进程

// 提示输出的文件目录,并退出
console.log(chalk.blue(`- Please go to check the file: ${chalk.underline(path.join(process.cwd(), outPath))}`))
process.exit()

操作加提示,并且输出的文字加颜色

// 使用一个非常方便的工具chalk
const chalk = require('chalk')

console.log(chalk.green('Start Conversion: '))

完整代码如下:

'use strict'
const fs = require('fs')
const path = require('path')
const chalk = require('chalk')
const glob = require('glob')
const co = require('co')
const prompt = require('co-prompt')
const Json2csvParser = require('json2csv').Parser

// 获取多文件的方法
const getMultiEntry = function (globPath) {
 let entries = {}

 glob.sync(globPath).forEach(function (entry) {
 const basename = path.basename(entry, path.extname(entry))
 entries[basename] = entry
 })

 return entries
}

module.exports = (paths) => {
 co(function* () {
 let [inPath, outPath] = paths
 // 处理用户输入
 inPath = inPath ? inPath : yield prompt('Input file directory: ')
 outPath = outPath ? outPath : (yield prompt('Output file directory: ')) || inPath

 // 遍历获取json文件
 const files = getMultiEntry(`${inPath}/*.json`)

 // 如果指定目录下没有json文件输出提示信息并退出进程
 if (!Object.keys(files).length) {
  console.log(chalk.red('\n x There is no JSON file in the specified folder'))
  process.exit()
 }

 // 开始转换文件
 console.log('\n ')
 console.log(chalk.green('Start Conversion: '))

 for(let filename in files) {
  // 同步读取文件
  let jsonData = fs.readFileSync(files[filename])
  jsonData = JSON.parse(jsonData)

  /*
  * 判断csv能接受的数据结构
  * 如果是json对象,则取key, value作为列
  * 如果是json数组,则读取第一行的所有key
  * */
  let jData, fields
  if(Object.prototype.toString.call(jsonData) === '[object Object]') {
  jData = Object.keys(jsonData).map(key => ({
   key: key,
   value: jsonData[key]
  }))
  fields = ['key', 'value']
  }
  if(Object.prototype.toString.call(jsonData) === '[object Array]') {
  jData = jsonData
  fields = Object.keys(jsonData[0])
  }

  // json格式 => csv格式
  const json2csvParser = new Json2csvParser({fields})
  const csvData = json2csvParser.parse(jData)

  // office Excel需要 BOM 头来定义 UTF-8编码格式
  const BOM = Buffer.from('\uFEFF')
  const bomCsv = Buffer.concat([BOM, Buffer.from(csvData)])

  // 写入的文件名
  const outputFileName = `${outPath}/${filename}.csv`

  // 不存在文件夹就创建
  if(!fs.existsSync(outPath)) {
  fs.mkdirSync(outPath)
  }

  // 写入文件
  const err = fs.writeFileSync(outputFileName, bomCsv)
  if(err) {
  return console.log(err)
  } else {
  console.log(chalk.green(`- ${filename}.json Conversion successful!`))
  }
 }

 // 提示输出的文件目录
 console.log('\n ')
 console.log(chalk.blue(`- Please go to check the file: ${chalk.underline(path.join(process.cwd(), outPath))}`))
 process.exit()
 })
}

之后就是使用命令了,如何安装使用命令?

package.json bin命令

实现,在项目根目录建一个bin目录,package.json定义个bin命令

使用nodejs实现JSON文件自动转Excel的工具(推荐)

在bin/json2excel.js 文件的开头写上 #!/usr/bin/env node

使用nodejs实现JSON文件自动转Excel的工具(推荐)

项目包安装的时候,npm就会在 /node_modules/.bin 里面安装一个bin命令,这样可以使用json2excel命令了,执行json2excel start *

如果是全局安装就可以在任何地方使用。

至此,一个json转csv的实现完美的完成。

从json转换csv,如果拿到csv如何还原成csv呢?

增加命令:

把json转csv更名为 json2excel j2c [paths]
csv转json取名为 json2excel c2j [paths]

csv转成json和前面的实现差不多,这里不再写了。

完整代码请看 https://github.com/zwzou/json2excel#readme

至此一个完整的json - excel格式转换完成。 期待以后扩展其它的格式

总结

到此这篇关于使用nodejs实现JSON文件自动转Excel的工具的文章就介绍到这了,更多相关nodejs实现JSON文件转Excel的工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

NodeJs 相关文章推荐
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 #NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 #NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 #NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 #NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 #NodeJs
Nodejs实现WebSocket代码实例
May 19 #NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 #NodeJs
You might like
关于文本留言本的分页代码
2006/10/09 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
资深生产主管自我评价
2013/09/22 职场文书
上班打牌检讨书
2014/02/07 职场文书
公司建议书怎么写
2014/05/15 职场文书
三八活动策划方案
2014/08/17 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python