# 使用 node-excel-stream 来按行处理 Excel 数据

- Link: https://www.ixiqin.com/2022/08/03/use-the-node-excel-to-press-line-processing-excel-data-stream/
- Published: 2022-08-03T06:00:00+08:00
- Author: 白宦成

文章目录

 [Toggle](https://www.ixiqin.com/2022/08/03/use-the-node-excel-to-press-line-processing-excel-data-stream/#)

 * [读取 Excel 内容](https://www.ixiqin.com/2022/08/03/use-the-node-excel-to-press-line-processing-excel-data-stream/#%e8%af%bb%e5%8f%96_excel_%e5%86%85%e5%ae%b9)
 * [写入 Excel 内容](https://www.ixiqin.com/2022/08/03/use-the-node-excel-to-press-line-processing-excel-data-stream/#%e5%86%99%e5%85%a5_excel_%e5%86%85%e5%ae%b9)
 * [总结](https://www.ixiqin.com/2022/08/03/use-the-node-excel-to-press-line-processing-excel-data-stream/#%e6%80%bb%e7%bb%93)

数据分析是一个非常常见的需求，而在实际的落地场景当中， Python 是使用最多的。不过
我因为写了很久的前端，其实对于Python已经生疏了。当我开始启动项目时，就会选择执行`
npm init` 来初始化一个项目。既然如此，就试着使用 Node.js 来做数据分析。

在 Node.js 当中操作 Excel ，最好的便是 [Exceljs](https://github.com/exceljs/exceljs)。
不过 [ExcelJs](https://github.com/exceljs/exceljs) 封装了大量的函数，对于绝大多数
的数据分析场景来说，可能并不适用（也不一定，只是我比较喜欢用代码来描述逻辑，Excel
更多是一个导入导出）。

当明确了我只是需要一个简单的导入导出后，那么 [node-excel-stream](https://github.com/vikramthyagarajan/node-excel-stream)
就进入了我的视野。

## 读取 Excel 内容

和 Exceljs 不同，node-excel-stream 的封装相对简单，就是一个 Reader 和 Writer ，提供
的方法也十分简单：读取文件、定义格式，按行处理内容；

需要注意的是，node-excel-stream 只支持 xlsx ，而不支持 xls，所以如果你用的是旧版，
则需要重新保存成 xlsx 来进行处理。

    ```javascript
    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`包裹起来

    ```javascript
    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 是一个不错的选择。
