【发布时间】:2019-07-30 09:43:42
【问题描述】:
在 Stack Overflow 上有很多关于如何使用 Javascript 创建 CSV 文件的信息。但我正在努力寻找一种方法来创建分号分隔的数据并且能够在下载时设置文件名。
以下是我的代码的简化版本。最后几行说明了这个问题:带冒号的 CSV 效果很好。带分号的 CSV 失败,浏览器不会下载文件(Chrome 显示“网络错误”)。
const arrayToCsvFile = (dataArray, delimiter, filename) => {
const csv = createCsv(dataArray, delimiter);
exportCsvToFile(csv, filename, delimiter);
};
const createCsv = (rows, delimiter) => {
let returnStr = "";
rows.forEach(row => {
row.forEach(field => {
returnStr += field + delimiter;
});
returnStr += "\r\n";
});
return returnStr;
};
const exportCsvToFile = (csvData, filename, delimiter) => {
csvData = "data:text/csv;charset=utf-8" + delimiter + csvData;
const encodedUri = encodeURI(csvData);
// Trick to set filename
const link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", filename);
document.body.appendChild(link); // Required for Firefox(?)
link.click();
};
const testData = [["a", "b", "c"], ["1", "2", "3"]];
// Line below works
// arrayToCsvFile(testData, ",", "myCustomFileNameWithCommaSep.csv");
// This does not work - browser fails to download file.
arrayToCsvFile(testData, ";", "myCustomFileNameWithSemiSep.csv");
【问题讨论】:
-
您的 CSV 生成函数非常原始,似乎无法转义任何字符。您应该强烈考虑使用像 papaparse.com 这样的库(它有一个
unparse函数来从 JavaScript 数据结构生成 CSV)。 -
我的真实世界数据只是数字。但是感谢@quentin 的提示,我会记住的。