将数据内容保存到 csv 中 - AngularJS

akb*_*ile 2 csv angularjs

嗨,我正在尝试将来自我的网络服务器的数据内容保存到 csv 文件中。

我正在尝试这个来自stackoverflow中各种问题的代码。

.success(function(data, status, headers, config) {
    console.log(data);
    if (data.success) {
        console.log(data);
        var saving = document.createElement('a');

        saving.href = 'data:attachment/csv,' + encodeURIComponent(data);
        saving.download = 'Summary.csv';
        saving.click();
    }
})
.error(function(data, status, headers, config) {
    console.log('error in downloading!');

});
Run Code Online (Sandbox Code Playgroud)

但是数据的内容没有保存到 my 中summary.csv,而是给了我这个 [object object]. 有人可以帮我弄这个吗?

Gre*_*egL 5

第一个问题是encodeURIComponent()需要一个字符串,而你给它一个对象,所以它调用.toString()它,这就是为什么你得到[object Object].

相反,您需要自己将数据数组转换为 CSV 字符串。如果您使用的是D3.js,则可以使用d3.csv.format(rows),这非常好。或者你可以找到另一个 JS CSV 库。或者您可以使用我刚刚为您编写的以下非常简单的实现:

function csv(arr) {
    var ret = [];
    ret.push('"' + Object.keys(arr[0]).join('","') + '"');
    for (var i = 0, len = arr.length; i < len; i++) {
        var line = [];
        for (var key in arr[i]) {
            if (arr[i].hasOwnProperty(key)) {
                line.push('"' + arr[i][key] + '"');
            }
        }
        ret.push(line.join(','));
    }
    return ret.join('\n');
}
Run Code Online (Sandbox Code Playgroud)

注意:此函数假定您向它传递一个包含至少一个元素的有效数组,并且所有元素都是具有完全相同键的对象。如果这些假设都不适合您,请扩展我的功能或使用更强大的第三方库。

因此,将所有这些放在一起,您的最终代码将是:

.success(function(data, status, headers, config) {
    console.log(data);
    if (data.success) {
        console.log(data);
        var saving = document.createElement('a');

        saving.href = 'data:attachment/csv,' + encodeURIComponent(csv(data.results));
        saving.download = 'Summary.csv';
        saving.click();
    }
})
.error(function(data, status, headers, config) {
    console.log('error in downloading!');
});
Run Code Online (Sandbox Code Playgroud)

请注意,我需要访问data.results以获取实际的结果数组。我假设您将使用我的csv()函数或另一个类似的函数将数组转换为 CSV 字符串。