首页 > 解决方案 > 对象为 CSV 格式并在 JavaScript 中导出

问题描述

导出为 CSV 后,大字符串正在获取并重写其他单元格屏幕截图 导出结果

链接到 jsfiddle 代码 在此处输入链接描述 问题是如何将 lar 字符串保留在不影响其他单元格数据的单元格中

var newS = {
        Name: "https://www.someweb.com/product/2019-new-shoulder-bags-leather-bucket-bag/452346283.html?d1_posid=6c776030d97bebe241c60070a53e7683&dspm=pcen.hp.relatedviewed.3.qJcEmZmc4A8ZV2ksdlct&resource_id=452346283#hp1507_reit-3-5|null:2001:r1045009996.json",
        rating: "Google Inc",
        rating: "Google Inc",
        Price: "554.52"
    }
stockData.push(newS);
}

function convertArrayOfObjectsToCSV(args) {
    var result, ctr, keys, columnDelimiter, lineDelimiter, data;

    data = args.data || null;
    if (data == null || !data.length) {
        return null;
    }

    columnDelimiter = args.columnDelimiter || ',';
    lineDelimiter = args.lineDelimiter || '\n';

    keys = Object.keys(data[0]);

    result = '';
    result += keys.join(columnDelimiter);
    result += lineDelimiter;

    data.forEach(function(item) {
        ctr = 0;
        keys.forEach(function(key) {
            if (ctr > 0) result += columnDelimiter;

            result += item[key];
            ctr++;
        });
        result += lineDelimiter;
    });

    return result;
}

标签: javascriptjsoncsv

解决方案


问题不在于您向我们展示的部分,而downloadCSV在于仅包含在您的小提琴中的实际功能。

if (!csv.match(/^data:text\/csv/i)) {
    csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);

encodeURI在为 URL 上下文正确编码数据时,几乎从来都不是正确的选择。

这需要改为使用encodeURIComponent- 但因为这也会在内部编码字符data:text/csv;charset=utf-8,,所以这两个步骤也需要以相反的顺序发生:

csv = encodeURIComponent(csv)
csv = 'data:text/csv;charset=utf-8,' + csv;
data = csv; // keept this, so the rest of your code can still work with the data variable

https://jsfiddle.net/vky7b5dg/

我在这里删除了 if 条件 - 如果数据data:text/csv在开始时已经包含,它无论如何都不会工作。然后需要在 URL 编码发生之前将其删除,然后再添加。此功能似乎尝试并且非常通用,但看起来您不需要该部分用于您的特定用例。


(当然,这仍然完全没有对 CSV 上下文的数据进行任何适当的转义。如果您的任何数据字段包含 a ,,这仍然会搞砸。但是,这是convertArrayOfObjectsToCSV函数的问题,而不是这个处理下载部分。)


推荐阅读