js中json数据转excel

1,507 阅读1分钟

前言:框架中一般使用# SheetJS比较多,处理一些复杂数据更为精准有效,但对不喜欢翻文档的小伙伴们来说,阅读起来有些困难,里面定义的一些方法名也是有点晦涩

一、json格式直接转表格

用于页面上,利用创建一个a标签,自点击下载,这种适用于页面量较小的数据,数据过大,还是用插件解决较好

const list =[
        {
            ID:0,
            name:'小明'
        },
        {
            ID:1,
            name:'小红'
        },
        {
            ID:2,
            name:'小白'
        },
        {
            ID:3,
            name:'小黑'
        }
    ]
    jsonToExcel(list, "ID,作者姓名")
 function jsonToExcel(data, head, name = '导出的文件名') {
    let str = head ? head + '\n' : '';
    data.forEach(item => {
    	// 拼接json数据, 增加 \t 为了不让表格显示科学计数法或者其他格式
        for(let key in item) {
            str = `${str + item[key] + '\t'},`
        }
        str += '\n'
    });
    console.log(str)
    // encodeURIComponent解决中文乱码
    const uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
     // 通过创建a标签实现
     const link = document.createElement("a");
     link.href = uri;
     // 对下载的文件命名
     link.download =  `${name + '.csv'}`;
     link.click();
}

二、利用node-xlsx插件

这种略微简单粗暴,弊端是不能一起生成表头,需要后期加上

const list =[
     {
       name:'sheet',
       data:[['0','小明'],['1','小红']]
     }
            ]
 const buffer = xlsx.build(list);
 fs.writeFile("testFile.xlsx", buffer, function (err) {
  if (err) {
  console.log(err, "保存excel出错");
     } else {
     console.log("写入excel成功!!!");
     }
});

小demo

const axios = require("axios").default;
const fs = require('fs')
const xlsx = require("node-xlsx");

var offset = 1;
var list1 = [];
function request() {
    axios({
            url: "https:xxx",
            data: {
                "offset": offset,
                "size": 20,
            },
            method: "POST"
        })
        .then((res) => {
            const listArr = res.data.data.list;
            if (listArr.length > 0) {
                offset++;
                list1.push(listArr)
                request();
            } else {
                const list = [{
                    name: 'sheet',
                    data: list1.flat().map(item => Object.values(item))
                }]
                request2(list);
            }
        })

}
request()

function request2(list) {
    const buffer = xlsx.build(list);
    fs.writeFile("test.xlsx", buffer,);
}