场景:产品给了一堆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');
输入文件如图:
输出文件如图: