在Node上将XLS转换为CSV文件

20

我有一个客户端的Web应用程序,带有一个非常简单的节点服务器,以访问客户端无法访问的某些数据之一是扩展名为.xls的Excel电子表格。

我正在尝试设置我的服务器来下载xls,将其转换为csv,然后将其发送回客户端。 我已经完成了下载部分,并且我确定我可以解决“发送回”部分,但我找不到一个好的库来将xls转换为csv。

有人可以指向一个可以简单地完成这项工作的库吗? Excel文件只是一个工作表,没有复杂的工作簿或其他任何东西。

或者还有其他我没有考虑到的方法吗?

2个回答

46

我正在使用这个软件包将XLSX转换为CSV: https://www.npmjs.com/package/xlsx

XLSX = require('xlsx');

const workBook = XLSX.readFile(inputFilename);
XLSX.writeFile(workBook, outputFilename, { bookType: "csv" });

2
这是非常优美且简单的解决方案,所以我认为这应该是默认答案。 - Koen
3
看起来很优雅,但它会创建一个带有空值的CSV文件,这些空值来自于你的Excel表格中的空单元格;因此,如果你要处理这个CSV文件(例如遍历其值),对于你的CPU和内存来说,这将是非常严重的。你需要迭代每个工作表数据的长度;因此,我认为所选答案更加健壮。 - Mabu

37

我不知道是否有现成的库可用,但你可以使用node-xlsx来解析Excel文件,获取行并自行制作CSV。以下是一个示例:

var xlsx = require('node-xlsx');
var fs = require('fs');
var obj = xlsx.parse(__dirname + '/test.xls'); // parses a file
var rows = [];
var writeStr = "";

//looping through all sheets
for(var i = 0; i < obj.length; i++)
{
    var sheet = obj[i];
    //loop through all rows in the sheet
    for(var j = 0; j < sheet['data'].length; j++)
    {
            //add the row to the rows array
            rows.push(sheet['data'][j]);
    }
}

//creates the csv string to write it to a file
for(var i = 0; i < rows.length; i++)
{
    writeStr += rows[i].join(",") + "\n";
}

//writes to a file, but you will presumably send the csv as a      
//response instead
fs.writeFile(__dirname + "/test.csv", writeStr, function(err) {
    if(err) {
        return console.log(err);
    }
    console.log("test.csv was saved in the current directory!");
});

谢谢。你能否提供一个示例代码来写入CSV文件,而不是使用console.log("test.csv was saved in the current directory!"); - Phil
2
@philipoghenerobobalogun 你试过了吗?因为它确实会写入文件。这就是 fs.writeFile(... 的作用。 - heinst
是的。我已经尝试了一下,它可以运行。当时太累了,没有尝试一下。 - Phil
1
工作得很好 - 只是要注意它不能处理值中的逗号,您需要添加双引号并转义包含双引号的值。 - SliverNinja - MSFT
如果我们想处理多个请求,这个程序能否及时运行? - Dev G
解析一个40MB的文件需要大约2GB的内存。使用xlsx库的解决方案也是如此。 - Clem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接