Javascript 如何从我的csv文件中删除BOM表标题?
我正在尝试创建一个基于数据的csv文件,该数据显示在我的网页上的表格中 问题 每次我触发“保存到csv”函数时,该文件都会在Excel中打开,但它不会解析各个字段(使用逗号分隔符)。所有内容都将始终显示在一列中。它将适当地划分不同的行。 在stackoverflow的大量测试/故障排除和帮助之后,我的真正问题是添加了一个BOM头,似乎把它搞乱了。当我在Notepad++中打开csv文件并更改编码以删除BOM表标题,然后在Excel中重新打开该文件时,它看起来很好Javascript 如何从我的csv文件中删除BOM表标题?,javascript,excel,csv,internet-explorer,Javascript,Excel,Csv,Internet Explorer,我正在尝试创建一个基于数据的csv文件,该数据显示在我的网页上的表格中 问题 每次我触发“保存到csv”函数时,该文件都会在Excel中打开,但它不会解析各个字段(使用逗号分隔符)。所有内容都将始终显示在一列中。它将适当地划分不同的行。 在stackoverflow的大量测试/故障排除和帮助之后,我的真正问题是添加了一个BOM头,似乎把它搞乱了。当我在Notepad++中打开csv文件并更改编码以删除BOM表标题,然后在Excel中重新打开该文件时,它看起来很好 function exportT
function exportTableToCSV($tableName, fileName) {
var csv = GetCellValues($tableName);
console.log(csv);
console.log("filename is:" + fileName);
if (navigator.userAgent.search("Trident") >= 0) {
//this is the path that is execute in IE10 browser...
window.CsvExpFrame.document.open("text/html", "replace");
window.CsvExpFrame.document.write(csv);
window.CsvExpFrame.document.close();
window.CsvExpFrame.focus();
window.CsvExpFrame.document.execCommand('SaveAs', true, fileName + ".csv");
} else {
var uri = "data:text/csv;charset=utf-8," + escape(csv);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = fileName + ".csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
};
代码
这就是代码的样子:(注意:非IE路径工作正常。)
问题
如何以编程方式删除BOM表标题
我到目前为止所做的尝试
到目前为止,我尝试了以下代码更改:
我注意到将文件另存为:
"UTF-8 BOM" fixes the issue.
"UTF-8" (aka no BOM) fixes the issue
"UCS-2 BE BOM" almost works but it adds some funky characters the first field's header, so it looks like this:
þÿ"Group Name"
我尝试更改代码以显式添加BOM表标题,如下所示:
window.CsvExpFrame.document.open("text/html", "replace");
window.CsvExpFrame.document.write("\uFEFF"+csv); // ADD BOM
//window.CsvExpFrame.document.write(csv);
window.CsvExpFrame.document.close();
window.CsvExpFrame.focus();
window.CsvExpFrame.document.execCommand('SaveAs', true, fileName + ".csv");
但根据Notepad++,此代码没有更改编码。它仍然设置为LE BOM。最后,我创建了这个csv文件的两个版本。两者都是由web应用程序生成的。但是对于第二个文件,我使用Notepad++将编码更改为一种有效的编码。然后我使用“Meld”尝试对这两个文件进行区分,但它们看起来是相同的 编辑2 如果我更改逻辑,使IE trident没有条件检查,但代码总是这样做:
function exportTableToCSV($tableName, fileName) {
var csv = GetCellValues($tableName);
console.log(csv);
console.log("filename is:" + fileName);
var uri = "data:text/csv;charset=utf-8," + encodeURIComponent(csv);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = fileName + ".csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
IE炸弹出现以下错误:
SCRIPT122:传递给系统调用的数据区域太小
“downloadLink.click();”调用失败。我认为这是一个解决方案,将CSV
字符串转换为Blob
,然后转换为ObjectURL
,对于IE10+,使用navigator.msSaveBlob
:
function exportCSV(csv, filename) {
if (!filename) {filename = 'export.csv';}
var blob = new Blob([csv], {type: 'text/csv;charset=utf-8;'});
if (!navigator.msSaveBlob) {
var link = document.createElement("a");
var url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", filename);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(blob);
} else {
navigator.msSaveBlob(blob, filename); // IE 10+
}
}
实施后:
function exportTableToCSV($tableName, fileName) {
var csv = GetCellValues($tableName); console.log(fileName, csv);
exportCSV(csv, fileName);
}
在Chrome、Firefox和IE11上测试,有几千行。只是一个问题,为什么不忘记“Trident”案例,使用另一种方法,这是一种好的安全方法,如果浏览器是IE Trident,可能也适用。@JavierRey这是一个很好的建议。但它失败了,出现了一个错误。请参见编辑2Oh是的,这不是我认为的好方法。链接URL的大小在浏览器中是有限的,在IE中是2080,在其他浏览器中是更多,但是对于大的CSV字符串来说仍然太小。我会尝试找到一个解决这个下载限制问题的方法,然后回到这里。非常好用。非常感谢