Javascript 如何从我的csv文件中删除BOM表标题?

Javascript 如何从我的csv文件中删除BOM表标题?,javascript,excel,csv,internet-explorer,Javascript,Excel,Csv,Internet Explorer,我正在尝试创建一个基于数据的csv文件,该数据显示在我的网页上的表格中 问题 每次我触发“保存到csv”函数时,该文件都会在Excel中打开,但它不会解析各个字段(使用逗号分隔符)。所有内容都将始终显示在一列中。它将适当地划分不同的行。 在stackoverflow的大量测试/故障排除和帮助之后,我的真正问题是添加了一个BOM头,似乎把它搞乱了。当我在Notepad++中打开csv文件并更改编码以删除BOM表标题,然后在Excel中重新打开该文件时,它看起来很好 function exportT

我正在尝试创建一个基于数据的csv文件,该数据显示在我的网页上的表格中

问题

每次我触发“保存到csv”函数时,该文件都会在Excel中打开,但它不会解析各个字段(使用逗号分隔符)。所有内容都将始终显示在一列中。它将适当地划分不同的行。 在stackoverflow的大量测试/故障排除和帮助之后,我的真正问题是添加了一个BOM头,似乎把它搞乱了。当我在Notepad++中打开csv文件并更改编码以删除BOM表标题,然后在Excel中重新打开该文件时,它看起来很好

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表标题

我到目前为止所做的尝试

到目前为止,我尝试了以下代码更改:

  • 尝试更改/指定编码,如下所示:(所有行都在此处注释掉了…但我循环遍历每一行并重试导出)

    //window.CsvExpFrame.document.open(“text/html”、“replace”); //window.CsvExpFrame.document.open('数据:text/csv;windows-1252;') //window.CsvExpFrame.document.open('data:text/csv;charset=utf-8;')) //window.CsvExpFrame.document.open('data:text/csv;charset=utf-8')

  • 试图删除标题,如下所示:

    //csv=csv。替换(/\uFFFD/g,“”) csv=csv。替换(/\uFEFF/g“”) window.CsvExpFrame.document.write(csv)

  • 到目前为止,一切都不起作用。如果你对我有什么建议,我将不胜感激。我一直在阅读stackoverflow上的其他类似帖子并尝试它们,但到目前为止还没有成功。我还没有找到一个特定于javascript的

    谢谢

    编辑1

    发布此问题后,我发现了一些额外的/有用的工件:

    在记事本++中打开文件时,编码设置为“UCS-2 LE 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字符串来说仍然太小。我会尝试找到一个解决这个下载限制问题的方法,然后回到这里。非常好用。非常感谢