亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用nodejs實(shí)現(xiàn)JSON文件自動(dòng)轉(zhuǎn)Excel的工具(推薦)

 更新時(shí)間:2020年06月24日 08:44:01   作者:Dawei  
這篇文章主要介紹了使用nodejs實(shí)現(xiàn),JSON文件自動(dòng)轉(zhuǎn)Excel的工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

這段時(shí)間做項(xiàng)目,需要把json格式的文檔給到業(yè)務(wù)人員去翻譯,每次手動(dòng)翻譯,很麻煩,于是就想著寫一個(gè)高逼格的自動(dòng)化工具來(lái)完成這件事情。

說(shuō)實(shí)現(xiàn),初步思路就是使用類似"json2excel start"這樣的命令,然后它就自己跑。像vue,react運(yùn)行命令一樣。

首先,我們 npm init 新建一個(gè)項(xiàng)目工程,新建我們項(xiàng)目的核心文件json2excel.js ,并運(yùn)行node json2exce.js,然后控制臺(tái)就可以打印東西了。

把一個(gè)文件轉(zhuǎn)化成另一個(gè)文件,我們要知道這個(gè)文件的路徑,以及保存到的位置,所以命令設(shè)計(jì)為:

json2excel start inpath outpath

我們使用一個(gè)非常好用的命令行輔助包"commander",提示命令輸入,json2excel.js如下,

const program = require('commander')

// 定義當(dāng)前的版本
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()
}

然后運(yùn)行node json2excel.js會(huì)看到(現(xiàn)在還沒(méi)安裝bin命令,所以用node json2excel代替json2excel),

非常哇瑟的一個(gè)操作,就可以看到命令引導(dǎo)提示了。

.command() 是定義命令及其后面的參數(shù),我們定義了paths
.description() 是描述
.alias() 是命令的別名

.action() 是運(yùn)行命令時(shí)要執(zhí)行的操作,paths是command里面?zhèn)鬟^(guò)來(lái)的參數(shù)

我們新建../command/j2c.js,.action()的時(shí)候我們有接受命令參數(shù)

module.exports = (paths) => {
 // 這樣就得到了輸入、輸出的路徑了
 let [inPath, outPath] = paths
}

如果命令參數(shù)沒(méi)有附帶怎么辦?

如: node json2excel start 不帶路徑然后就回車

那我們就引導(dǎo)用戶再次輸入,使用"co","co-prompt"這兩個(gè)工具

上代碼:../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函數(shù),主要是異步操作作同步處理的寫法。

運(yùn)行 node json2excel start

這樣就可以保證拿到輸入輸出的路徑了,用戶體驗(yàn)滿分,棒棒的。

下一步, 通過(guò)拿到的輸入路徑,獲取json文件 ,使用"glob"這個(gè)工具,通過(guò)正則匹配拿到inpath路徑下所有的json文件

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

拿到j(luò)son文件,我們就開(kāi)始向Excel轉(zhuǎn)換,csv是一種和json一樣簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),我們把json轉(zhuǎn)成csv的格式。

以下是json格式和csv格式的對(duì)比,這樣去看,轉(zhuǎn)換也不難。左邊是json數(shù)據(jù)格式,右邊是字符串,可以這么理解。

我們使用"json2csv"這個(gè)包,有時(shí)間的也可以自己轉(zhuǎn)換拼接。

讀取json文件并轉(zhuǎn)換成scv:

const Json2csvParser = require('json2csv').Parser

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

 // json2csv轉(zhuǎn)換
 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!`)
 }
}

運(yùn)行后可以得到一個(gè).csv的文件,一個(gè)簡(jiǎn)單的實(shí)現(xiàn)完成。

細(xì)節(jié)優(yōu)化,并實(shí)現(xiàn):

在office下會(huì)顯示亂碼,所以要定義為UTF-8的格式存儲(chǔ)。

// office Excel需要 BOM 頭來(lái)定義 UTF-8編碼格式
const BOM = Buffer.from('\uFEFF')
const csvData = Buffer.concat([BOM, Buffer.from(csvData)])

如果輸出路徑不存在,存儲(chǔ)也不會(huì)成功

// 不存在文件夾就創(chuàng)建
if(!fs.existsSync(outPath)) {
 fs.mkdirSync(outPath)
}

json格式數(shù)據(jù),有對(duì)象形式的,也有數(shù)組形式的,如果是對(duì)象就轉(zhuǎn)化成數(shù)組

// 如果是對(duì)象,把對(duì)象的每一個(gè)鍵值對(duì),轉(zhuǎn)化成'key', 'value'的數(shù)組項(xiàng)
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])
}

存儲(chǔ)成功顯示文件存儲(chǔ)的路徑,并退出進(jìn)程

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

操作加提示,并且輸出的文字加顏色

// 使用一個(gè)非常方便的工具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`)

 // 如果指定目錄下沒(méi)有json文件輸出提示信息并退出進(jìn)程
 if (!Object.keys(files).length) {
  console.log(chalk.red('\n x There is no JSON file in the specified folder'))
  process.exit()
 }

 // 開(kāi)始轉(zhuǎn)換文件
 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能接受的數(shù)據(jù)結(jié)構(gòu)
  * 如果是json對(duì)象,則取key, value作為列
  * 如果是json數(shù)組,則讀取第一行的所有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 頭來(lái)定義 UTF-8編碼格式
  const BOM = Buffer.from('\uFEFF')
  const bomCsv = Buffer.concat([BOM, Buffer.from(csvData)])

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

  // 不存在文件夾就創(chuàng)建
  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命令

實(shí)現(xiàn),在項(xiàng)目根目錄建一個(gè)bin目錄,package.json定義個(gè)bin命令

在bin/json2excel.js 文件的開(kāi)頭寫上 #!/usr/bin/env node

項(xiàng)目包安裝的時(shí)候,npm就會(huì)在 /node_modules/.bin 里面安裝一個(gè)bin命令,這樣可以使用json2excel命令了,執(zhí)行json2excel start *

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

至此,一個(gè)json轉(zhuǎn)csv的實(shí)現(xiàn)完美的完成。

從json轉(zhuǎn)換csv,如果拿到csv如何還原成csv呢?

增加命令:

把json轉(zhuǎn)csv更名為 json2excel j2c [paths]
csv轉(zhuǎn)json取名為 json2excel c2j [paths]

csv轉(zhuǎn)成json和前面的實(shí)現(xiàn)差不多,這里不再寫了。

完整代碼請(qǐng)看 https://github.com/zwzou/json2excel#readme

至此一個(gè)完整的json - excel格式轉(zhuǎn)換完成。 期待以后擴(kuò)展其它的格式

總結(jié)

到此這篇關(guān)于使用nodejs實(shí)現(xiàn)JSON文件自動(dòng)轉(zhuǎn)Excel的工具的文章就介紹到這了,更多相關(guān)nodejs實(shí)現(xiàn)JSON文件轉(zhuǎn)Excel的工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs中使用HTTP分塊響應(yīng)和定時(shí)器示例代碼

    nodejs中使用HTTP分塊響應(yīng)和定時(shí)器示例代碼

    本文通過(guò)示例將要?jiǎng)?chuàng)建一個(gè)輸出純文本的HTTP服務(wù)器,輸出的純文本每隔一秒會(huì)新增100個(gè)用換行符分隔的時(shí)間戳。實(shí)例代碼非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-03-03
  • 詳解使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密

    詳解使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密

    這篇文章主要介紹了使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 淺析Node.js中的內(nèi)存泄漏問(wèn)題

    淺析Node.js中的內(nèi)存泄漏問(wèn)題

    這篇文章主要介紹了淺析Node.js中的內(nèi)存泄漏問(wèn)題,Node.js是使JavaScript應(yīng)用在服務(wù)器端運(yùn)行的一款框架,需要的朋友可以參考下
    2015-06-06
  • Node.js中下包速度慢問(wèn)題解決方法分析

    Node.js中下包速度慢問(wèn)題解決方法分析

    這篇文章主要介紹了Node.js中下包速度慢問(wèn)題解決方法,分析了npm切換鏡像源以及nrm工具鏡像源管理相關(guān)使用技巧,需要的朋友可以參考下
    2023-04-04
  • 使用nodejs開(kāi)發(fā)cli項(xiàng)目實(shí)例

    使用nodejs開(kāi)發(fā)cli項(xiàng)目實(shí)例

    這篇文章主要介紹了使用nodejs開(kāi)發(fā)cli項(xiàng)目實(shí)例,本文講解使用generator-cli-starter實(shí)現(xiàn)cli項(xiàng)目的開(kāi)發(fā),需要的朋友可以參考下
    2015-06-06
  • nodejs文件夾深層復(fù)制功能

    nodejs文件夾深層復(fù)制功能

    這篇文章主要介紹了nodejs文件夾深層復(fù)制功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 談?wù)刵ode.js中的模塊系統(tǒng)

    談?wù)刵ode.js中的模塊系統(tǒng)

    這篇文章主要介紹了node.js中的模塊系統(tǒng),幫助大家更好的理解和學(xué)習(xí)node.js框架,感興趣的朋友可以了解下
    2020-09-09
  • 使用Node.js實(shí)現(xiàn)一個(gè)文章生成器

    使用Node.js實(shí)現(xiàn)一個(gè)文章生成器

    本文將從零開(kāi)始,講解如何使用Node.js來(lái)實(shí)現(xiàn)一個(gè)文章生成器,node里面有很多優(yōu)秀的模塊,現(xiàn)在我們就借助node的fs模塊來(lái)操控文本,來(lái)實(shí)現(xiàn)我們想要的效果,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-07-07
  • Node.js的包詳細(xì)介紹

    Node.js的包詳細(xì)介紹

    這篇文章主要介紹了Node.js的包詳細(xì)介紹,Node.js的包是一個(gè)目錄,其中包含JSON格式的包說(shuō)明文件package.json,Node.js的包基本遵循CommonJS規(guī)范,需要的朋友可以參考下
    2015-01-01
  • nodejs之get/post請(qǐng)求的幾種方式小結(jié)

    nodejs之get/post請(qǐng)求的幾種方式小結(jié)

    下面小編就為大家?guī)?lái)一篇nodejs之get/post請(qǐng)求的幾種方式小結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論