数据分析是一个非常常见的需求,而在实际的落地场景当中, Python 是使用最多的。不过我因为写了很久的前端,其实对于Python已经生疏了。当我开始启动项目时,就会选择执行 npm init
来初始化一个项目。既然如此,就试着使用 Node.js 来做数据分析。
在 Node.js 当中操作 Excel ,最好的便是 Exceljs。不过 ExcelJs 封装了大量的函数,对于绝大多数的数据分析场景来说,可能并不适用(也不一定,只是我比较喜欢用代码来描述逻辑,Excel 更多是一个导入导出)。
当明确了我只是需要一个简单的导入导出后,那么 node-excel-stream 就进入了我的视野。
读取 Excel 内容
和 Exceljs 不同,node-excel-stream 的封装相对简单,就是一个 Reader 和 Writer ,提供的方法也十分简单:读取文件、定义格式,按行处理内容;
需要注意的是,node-excel-stream 只支持 xlsx ,而不支持 xls,所以如果你用的是旧版,则需要重新保存成 xlsx 来进行处理。
let dataStream = fs.createReadStream('data.xlsx');
let reader = new ExcelReader(dataStream, {
sheets: [{
name: 'Users',
rows: {
headerRow: 1,
allowedHeaders: [{
name: 'User Name',
key: 'userName'
}, {
name: 'Value',
key: 'value',
type: Number
}]
}
}]
})
console.log('starting parse');
reader.eachRow((rowData, rowNum, sheetSchema) => {
console.log(rowData);
})
.then(() => {
console.log('done parsing');
});
Code language: JavaScript (javascript)
写入 Excel 内容
写入时和读取时相比,稍微复杂一点,需要将所有的输入使用 Promise.all
包裹起来
let writer = new ExcelWriter({
sheets: [{
name: 'Test Sheet',
key: 'tests',
headers: [{
name: 'Test Name',
key: 'name'
}, {
name: 'Test Coverage',
key: 'testValue',
default: 0
}]
}]
});
let dataPromises = inputs.map((input) => {
// 'tests' is the key of the sheet. That is used
// to add data to only the Test Sheet
writer.addData('tests', input);
});
Promise.all(dataPromises)
.then(() => {
return writer.save();
})
.then((stream) => {
stream.pipe(fs.createWriteStream('data.xlsx'));
});
Code language: JavaScript (javascript)
总结
如果你需要将 Excel 导入到 Js 当中进行处理,那么 node-excel-stream 是一个不错的选择。