将json数据导出到excel表

在同一文件夹下有若干json文件,json文件中包含接口请求和返回报文的数据参数名和参数类型等信息。现需要同一该文件夹下所有json文件中所有的参数名及其出现次数,并将其以excel表格的形式导出作为统计对比。

json数据样式

"Metadata" : { "ServiceId" : "serviceID" , "InterfaceName" : "接口名称" , "Uri" : "http:/example/theUrl" , "RequestType" : "json/wsdl" , "RequestProtocol" : "http" , "InterfaceDescription" : "测试" "Request" : { "$schema" : "http://json-scma.org/theurl" , "type" : "object" , "required" : true , "properties" : { "ReqBody" : { "type" : "object" , "required" : true , "properties" : { "paramA" : { "description" : "参数1" , "type" : "string" , "required" : true "paramb" : { "description" : "参数2" , "type" : "string" , "required" : false "name" : { "description" : "姓名" , "type" : "string" , "required" : true "Response" : { "$schema" : "http://json-s/chema" , "type" : "object" , "required" : true , "properties" : { "RspBody" : { "type" : "object" , "required" : true , "properties" : { "paramA" : { "description" : "参数1" , "type" : "string" , "required" : true "paramc" : { "description" : "参数3" , "type" : "string" , "required" : false "Id" : { "description" : "id" , "type" : "string" , "required" : true "items" : { "dessription" : "ssds" , "type" : "array" , "properties" : { "arrayName" : [ { "arrayParam" : "param" , "arrayParam22" : "31"
  1. 首先需要导入所有需要统计的json文件到一个对象数组中,以便后续进行对数据的遍历。
let fs = require('fs') //导入文件读取所需要的fs模块
//以同步的方式获取当前文件夹下所有json文件名,获取所有文件数据并写入newData数组中
let dir = fs.readdirSync("./")
let newData = []
for (const iterator of dir) {
    //获取对应文件名的具体内容,存入newData数组
    let dataElement = require('./' + iterator)
    newData.push(dataElement)
  1. 设置input和output对象作为记录所有参数及其出现次数的全局变量
let input ={}, output ={} //初始情况下二者皆为空对象
  
  • 获取到所有需要的数据就要对其进行处理。已知所有json文件都具有Request和Response部分,将其作为判断是否进行后续分析处理的入口,以此排除掉文件夹中可能出现的不属于json格式的数据。Request和Response部分的数据格式基本相同,因此可以使用类似的方法进行处理。

  • 首先获取其内部实际存储参数名和类型的子对象,即Request.properties.ReqBody.properties部分,若其不是array类型,则其内部没有子对象,是一个string或number类型的普通参数。

  • 那么遍历input对象,比较参数名是否已在input对象中。若input中没有该参数名则添加该参数名,value初值设置为1,若input中已有该参数名这则将其value值在原来的基础上加一。

  • 若其是array类型,说明仍有子对象,需要进一步遍历。尤其数据格式可知子对象在value.items.properties中,对其进行上述类似处理即可

  • 对于Response对象的处理与Request的处理类似

//记录参数名及其出现次数方法
function getParam(data) {
    if (data.Request && data.Response) {
        let req = data.Request.properties.ReqBody.properties    //请求报文参数
        let res = data.Response.properties.RspBody.properties   //响应报文参数
        for (const [key, value] of Object.entries(req)) {
            //若type不是array则不是数组类型,无嵌套,对应的值存入对象即可
            if (value.type !== 'array') {
                let flag = false    //flag为false则input中没有对应的值
                //查找当前input中是否有该报文中的参数,若有,则值+1,否则将设置其出现的次数初值为1
                for (const [key1, value1] of Object.entries(input)) {
                    if (key1 === key) {
                        flag = true
                        break
                if (flag) {
                    input[key] = input[key] + 1
                } else {
                    input[key] = 1
            } else {
                //type为array类型,有数组嵌套数据,需要进一步的获取到value.items.properties进行遍历,原理同上
                for




    
 (const [key1, value1] of Object.entries(value.items.properties)) {
                    for (const [key2, value2] of Object.entries(input)) {
                        if (key2 === key1) {
                            flag = true
                            break
                    if (flag) {
                        input[key1] = input[key1] + 1
                    } else {
                        input[key1] = 1
        // console.log(input);
        //获取响应报文参数出现次数,原理同上
        for (const [key, value] of Object.entries(res)) {
            let flag = false    //flag为false则input中没有对应的值
            if (value.type !== 'array') {
                for (const [key1, value1] of Object.entries(output)) {
                    if (key1 === key) {
                        flag = true
                        break
                if (flag) {
                    output[key] = output[key] + 1
                } else {
                    output[key] = 1
            } else {
                for (const [key1, value1] of Object.entries(value.items.properties)) {
                    for (const [key2, value2] of Object.entries(output)) {
                        if (key2 === key1) {
                            flag = true
                            break
                    if (flag) {
                        output[key1] = output[key1] + 1
                    } else {
                        output[key1] = 1
        // console.log(output);
  1. 将数据导出到excel文件中
let XLSX = require('js-xlsx')
//导出excel
function geneExcel(input1, output1) {
    /** newJson数据格式:
     *  [{paramA:1},{paramB:2}...]
    let newJson = []
    for (const [key, value] of Object.entries(output1)) {
        newJson.push({ paramName: key, value: value })
    let tmpdata = newJson[0];
    newJson.unshift({});
    let keyMap = []; //获取keys
    //keyMap =Object.keys(json[0]);
    for (let k in tmpdata) {
        keyMap.push(k);
        newJson[0][k] = k;
    let tmpdata = [];//用来保存转换好的json 
    newJson.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
        v: v[k],
        position: (String.fromCharCode(65 + j)) + (i + 1)
    }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
        v: v.v
    });
    let outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
    console.log(tmpdata);
     * workboot标准写法
     *  SheetName:['SheetName'],
     *  Sheets:{
     *      'SheetName':{
     *          '!ref':'A1:E4', //必须要有这个范围才能输出,否则导出的 excel 会是一个空表
     *          A1:{v:'id'},
     *          A2:{v:'name'},
     *      }
    let tmpWB = {
        SheetNames: ['mySheet'], //保存的表标题
        Sheets: {
            'mySheet': Object.assign({},
                tmpdata, //内容
                    '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
    //导出excel
    XLSX.writeFile(tmpWB, 'output.xlsx');
  1. 所有代码整合示例
let XLSX = require('js-xlsx')
let fs = require('fs')
//全局定义输入和输出字段名称和出现次数{key:paramName,value:actTime}
let input = {}
let output = {}
//读入当前文件夹下所有json文件,将所有文件数据写入newData数组中




    

let dir = fs.readdirSync("./")
let newData = []
for (const iterator of dir) {
    //获取对应文件名的具体内容,存入newData数组
    let dataElement = require('./' + iterator)
    newData.push(dataElement)
//遍历数组内容,获取参数名称并记录出现次数
for (let i = 1; i < newData.length; i++) {
    getParam(newData[i])
// console.log(input);
// console.log(output);
//得到参数数据结果,导出为excel文件
geneExcel(input, output)
//记录参数名及其出现次数方法
function getParam(data) {
    if (data.Request && data.Response) {
        let req = data.Request.properties.ReqBody.properties    //请求报文参数
        let res = data.Response.properties.RspBody.properties   //响应报文参数
        for (const [key, value] of Object.entries(req)) {
            //若type不是array则不是数组类型,无嵌套,对应的值存入对象即可
            if (value.type !== 'array') {
                let flag = false    //flag为false则input中没有对应的值
                //查找当前input中是否有该报文中的参数,若有,则值+1,否则将设置其出现的次数初值为1
                for (const [key1, value1] of Object.entries(input)) {
                    if (key1 === key) {
                        flag = true
                        break
                if (flag) {
                    input[key] = input[key] + 1
                } else {
                    input[key] = 1
            } else {
                //type为array类型,有数组嵌套数据,需要进一步的获取到value.items.properties进行遍历,原理同上
                for (const [key1, value1] of Object.entries(value.items.properties)) {
                    for (const [key2, value2] of Object.entries(input)) {
                        if (key2 === key1) {
                            flag = true
                            break
                    if (flag) {
                        input[key1] = input[key1] + 1
                    } else {
                        input[key1] = 1
        // console.log(input);
        //获取响应报文参数出现次数,原理同上
        for (const [key, value] of Object.entries(res)) {
            let flag = false    //flag为false则input中没有对应的值
            if (value.type !== 'array') {
                for (const [key1, value1] of Object.entries(output)) {
                    if (key1 === key) {
                        flag = true
                        break
                if (flag) {
                    output[key] = output[key] + 1
                } else {
                    output[key] = 1
            } else {
                for (const [key1, value1] of Object.entries(value.items.properties)) {
                    for (const [key2, value2] of Object.entries(output)) {
                        if (key2 === key1) {
                            flag = true
                            break
                    if (flag) {
                        output[key1] = output[key1] + 1
                    } else {
                        output[key1] = 1
        // console.log(output);
//导出excel
function geneExcel(input1, output1) {
    /** newJson数据格式:
     *  [{paramA:1},{paramB:2}...]
    let newJson = []
    for (const [key, value] of Object.entries(output1)) {
        newJson.push({ paramName: key, value: value })
    let tmpdata = newJson[0];
    newJson.unshift({});
    let keyMap = []; //获取keys
    //keyMap =Object.keys(json[0]);
    for (let k in tmpdata) {
        keyMap.push(k);
        newJson[0][k] = k;
    let tmpdata = [];//用来保存转换好的json 
    newJson.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
        v: v[k],
        position: (String.fromCharCode(65 + j)) + (i + 1)
    }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
        v: v.v
    });
    let outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
    console.log(tmpdata);
     * workboot标准写法
     *  SheetName:['SheetName'],
     *  Sheets:{
     *      'SheetName':{
     *          '!ref':'A1:E4', //必须要有这个范围才能输出,否则导出的 excel 会是一个空表
     *          A1:{v:'id'},
     *          A2:{v:'name'},
     *      }
    let tmpWB = {
        SheetNames: ['mySheet'], //保存的表标题
        Sheets: {
            'mySheet': Object.assign({},
                tmpdata, //内容
                    '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
    //导出excel
    XLSX.writeFile(tmpWB, 'output.xlsx');
                    将json数据导出到excel表应用情景在同一文件夹下有若干json文件,json文件中包含接口请求和返回报文的数据参数名和参数类型等信息。现需要同一该文件夹下所有json文件中所有的参数名及其出现次数,并将其以excel表格的形式导出作为统计对比。json数据样式{	"Metadata": {		"ServiceId": "serviceID",		"InterfaceName":...
今天接到个小任务,让把json文件换成excel文件,按照列展开.
思路:既然json已经都已经是现成的,那直接将json文件做读操作,在通过不同的key,找到对应的信息,在存到单元格中,在写操作,生成excel文档
二.jar包
涉及到的jar包,阿里的fastjson和poi的jar包
我的json文档里数据的格式是这样的
        "total":...
				
在程序员的工作中,经常有产品或者运营部门的小姐姐需要数据,由于不懂技术,就需要我们将Json格式的数据换成Excel文档提供给她们进行数据分析。 本文就介绍一个非常简单方便的方法 1.运用的是Excel格自带的功能 首先打开Excel文件 点击插入,点击获取加载项 点击应用商店,搜索json,点击添加 点击我的加载项,点一下需要的加载项就添加上了 在头就可以看到添加的json插件 创建一个nodejs文件,这里我起名为excel.js 在控制台npm init初始化项目,文件根目录生成配置文件 安装node-xlsx,用于读取格的内容,也就是excel npm install node-xlsx --save 使用node-xlsx读取格的数据
背景:某个项目采用mock模拟数据,客户给了一份Excel,身为前端的我等了一个星期的数据还是没有等到,中间穿插了N个项目。。。故事是这样开始的     某一天老板跟我说:“小王啊,我最近实在太忙,这数据实在没有时间处理,你帮忙处理下吧!”      我:“这个没有弄过。。。”  心想:“我是一名前端,这不是后端的事吗”     老板:“你搜下node插件,有专门处理Excel数据的,很简单...
我们在工作过程中,偶尔会有需求是把json换成excel的需求。一般这个时候,我们会跑到度娘那,在输入框中输入:“json excel”。然后,你会发现这个一个网站“https://json-csv.com/”, 出现在结果的第一个位置。 进去用了一下,很好用。收藏了。但是过几天,又要用的时候,忽然发现,导不出excel了。盯着上面的英文看了一会。发现这TMD的网站,居然对文件大
exceljs : https://github.com/guyonroche/exceljs 1、先来个导入excel这里写代码片 解析方法var Excel = require('exceljs');var workbook = new Excel.Workbook(); var data = []; workbook.xlsx.readFile('import.xlsx')
1.创建一个空文件夹,在当前目录下打开控制台,执行npm init命令自动生成package.json 执行npm install xls-to-json .新建index.js node_xj = require("xls-to-json"); node_xj({ input: "xls/test.xlsx", // input xls output: "beijing.json", // output json // sheet: "sheet" // specific sheetn.
当你想要读取多个 JSON 文件并把它们合并成一个 JSON 对象时,可以使用 Node.js 的 fs 模块来实现。 首先,使用 fs.readFileSync() 方法来同步读取每个文件,然后使用 JSON.parse() 方法将文件内容解析为 JSON 对象。最后,使用 JavaScript 的 Object.assign() 方法将多个对象合并成一个对象。 const fs = require('fs'); let json1 = JSON.parse(fs.readFileSync('file1.json')); let json2 = JSON.parse(fs.readFileSync('file2.json')); let json3 = JSON.parse(fs.readFileSync('file3.json')); let mergedJson = Object.assign({}, json1, json2, json3); 上面的代码会读取三个文件 file1.json、file2.json 和 file3.json,并将它们的内容合并成一个对象 mergedJson。 注意:fs.readFileSync() 是同步读取文件的方法,它会阻塞 Node.js 的事件循环,因此不推荐在生产环境中使用。在生产环境中,建议使用 fs.readFile() 方法,它是异步读取文件的方法