我正在尝试将不同类型的数据从我的数据库导出到Nodejs中的CSV文件并表达。到目前为止,我已经尝试了几个库,似乎没有任何工作像我预期的那样有很多不同的原因。
我该如何解决这个问题?我应该知道什么才能将我想要的所有数据导出到CSV文件?以及如何强制浏览器执行此操作?
由于
答案 0 :(得分:2)
所以,经过大量的努力之后,我将分享我的主要见解,对于谁在Web开发中迈出第一步并不是那么明显。
导出为CSV可分为两个主要步骤: 1.将您的数据安排到CSV结构/模型中。 2.导出数据/使其在客户端下载。
所以我会把它分解。 第一步 - 将数据排列为CSV结构/模型: 要将数据转换为CSV结构,很可能您可以找到一个库,该库可以获取您要导出的数据并将其格式化为CSV格式。 如果您的数据模型与我的数据模型一样复杂,则必须创建自定义函数。无论哪种方式,这都不应该太复杂。 我使用的这种功能的一个例子:
// The function gets a list of objects ('dataList' arg), each one would be a single row in the future-to-be CSV file
// The headers to the columns would be sent in an array ('headers' args). It is taken as the second arg
function dataToCSV(dataList,headers){
var allObjects = [];
// Pushing the headers, as the first arr in the 2-dimensional array 'allObjects' would be the first row
allObjects.push(headers);
//Now iterating through the list and build up an array that contains the data of every object in the list, in the same order of the headers
dataList.forEach(function(object){
var arr = [];
arr.push(object.id);
arr.push(object.term);
arr.push(object.Date);
// Adding the array as additional element to the 2-dimensional array. It will evantually be converted to a single row
allObjects.push(arr)
});
// Initializing the output in a new variable 'csvContent'
var csvContent = "";
// The code below takes two-dimensional array and converts it to be strctured as CSV
// *** It can be taken apart from the function, if all you need is to convert an array to CSV
allObjects.forEach(function(infoArray, index){
var dataString = infoArray.join(",");
csvContent += index < allObjects.length ? dataString+ "\n" : dataString;
});
// Returning the CSV output
return csvContent;
}
现在,第二步 - 导出数据: 为了导出数据,在检查了几个选项之后,我发现最方便(对我而言)是通过HTTP标头发送数据并使浏览器下载文件并将其解析为CSV。我用以下代码制作的:
//this statement tells the browser what type of data is supposed to download and force it to download
res.writeHead(200, {
'Content-Type': 'text/csv',
'Content-Disposition': 'attachment; filename=*custom_name*.csv'
});
// whereas this part is in charge of telling what data should be parsed and be downloaded
res.end(dataToCSV(dataList,["ID","Name","Date"]),"binary");
总之, 我做了这篇文章,所以其他人不会像我在使用nodejs和express导出CSV时那样挣扎。 如果您发现任何错误,或者您认为上述某些内容应该得到更彻底的解释,请告诉我,我会做出必要的更改。
亲切的问候。