node批量读取Excel数据导出json文件

981 阅读1分钟

场景:产品给了一堆Excel表格,需要统计里面的数据用作可视化开发,不可能手动统计数据,费时费力,所以想到使用node批量读取Excel数据并且到处json文件,没什么难点,直接上代码;使用到的node包:node-xlsx

const xlsx = require('node-xlsx');
const fs = require('fs');
const { writeFile: _writeFile } = require('fs');
const path = require('path');
class ReadDir2Json {
  constructor() {
    return (dirPath, outputFileName) => this.writeFile(dirPath, outputFileName);
  }
  
  /**
   * 递归读取文件夹数据
   * @param {String} entry 文件入口
   * @returns {String} 序列化的对象数据
   */
  readDir(entry) {
    const allData = {};
    const dirInfo = fs.readdirSync(entry);
    console.log('dirInfo===', dirInfo);
    dirInfo.forEach((item) => {
      const location = path.join(entry, item);
      const info = fs.statSync(location);
      if (info.isDirectory()) {
        console.log(`dir:${location}`);
        readDir(location);
      } else {
        console.log(`file:${location}`);
        const list = xlsx.parse(location); // 需要转换的excel文件
        const data = list[0].data.slice(1); // 数据处理 获取excel表格第一个表除去表头的数据
        const len = data.length;
        const outData = [];
        for (let i = 0; i < len; i++) {
          const item = data[i];
          let isValid = false;
          // 由于表格提供者可能不严谨,出现无效数据,例如无意键入空格,需要筛选数据
          for (let idx = 0; idx < item.length; idx++) {
            const itemInner = item[idx];
            // 此处判断条件可根据自己的需求修改
            if (+itemInner > 0) {
              isValid = true;
              break;
            }
          }
          if (isValid) {
            const dataItem = {
              gap: +item[0],
              age: +item[1],
              premium: +item[2],
              balance: +item[3],
            };
            outData.push(dataItem);
            console.log(item);
          } else {
            continue;
          }
        }
        // 文件名作为key存入json
        allData[item.slice(0, item.length - 5)] = outData;
      }
    });
    return JSON.stringify(allData);
  }
  
/**
   *将读取到的数据写出
   * @param {String} dirPath 文件夹入口
   * @param {String} outputFileName  文件输出名
   */
  writeFile(dirPath, outputFileName) {
    const allData = this.readDir(dirPath);
    // 文件编码格式  utf-8
    _writeFile(outputFileName, allData, 'utf-8', (err) => {
      if (!err) {
        console.log('文件生成成功'); 
      } else {
        console.log('文件生成失败');
      }
    });
  }
}

const readDir2Json = new ReadDir2Json();
readDir2Json('./data', 'data.json');

输入文件如图:

image.png 输出文件如图:

image.png