上传xls文件并读取内容

Posted by yuk on 2016-05-05

功能需求:上传excel文件并解析内容
最简单的方法是
1.上传到服务器
2.使用node-xlsx解析文件并返回
我又想新增一个就是能直接在内存中解析而不保存到服务器。对于小应用来说这并不占用资源。

在koa里解析表单采用了封装过的 co-busboy。 读取出来后part是一个读取流,正常情况是通过pipe写入到一个写入流

1
2
3
4
5
6
7
8
9
10
var parse = require('co-busboy');
app.use(function* (next) {
var parts = parse(this, {
autoFields: true
})
var part
while (part = yield parts) {
part.pipe(fs.createWriteStream('some file.txt'))
}
})

然而node-xlsx只能解析一个buffer或者一个文件

1
2
var xlsxFile = xlsx.parse( Buffer.concat(chunks, size) );
console.log(xlsxFile[0].data)

那么现在的问题变成是: 怎样把一个读取流的数据写入到buffer中。
只需要箭筒读取流part的data和end事件,把buffer重新拼接出来就可以了。
当然需要捕捉错误,而且需要用Promise形式来重写
当然 下面的代码并没有处理同时传多个excel文件的情况。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

while (part = yield parts) {
fileData = yield new Promise(function(resolve, reject) {
var chunks = [];
var size = 0;
part.on('data', function(chunk) {
chunks.push(chunk);
size += chunk.length;
});
part.on('end', function() {
try{
var xlsxFile = xlsx.parse( Buffer.concat(chunks, size) );
delete chunks;
resolve(xlsxFile[0].data)
}catch (err){
reject(err)
}

});
});
}
this.body = {
success: true,
msg: fileData
};

发下内存泄漏了!!!!待解决….