将2D javascript数组导出到Excel工作表

时间:2017-08-10 10:51:05

标签: javascript html excel export-to-excel window.open

我知道,这里有关于这个主题的数百个问题,但经过一天的搜索后我仍然找不到满意的答案:

我有一个2D javascript数组,我想将其作为Excel工作表下载。

这是我到目前为止获得的代码的小提琴:

https://jsfiddle.net/3an24jmw/7/

下载有效,但有几个问题,经过几天尝试后我无法解决:

  1. 所有项目最终都在Excel工作表的第一列中,因为Excel会解释","将元素分离为数据的一部分。如何以Excel理解的方式分离元素?
  2. 文件名是一些神秘的代码。如何设置文件名?
  3. 下载的文件有两个.xls结尾(.xls.xls)。如何获得单个.xls结尾?
  4. Excel会在每次文件损坏或不安全时告诉我。我该如何阻止这种情况?
  5. 任何这些问题的任何帮助都将不胜感激。

    exportToCsv = function() {
        var CsvString = "";
        Results.forEach(function(RowItem, RowIndex) {
            RowItem.forEach(function(ColItem, ColIndex) {
                CsvString += ColItem + ',';
            });
    
            CsvString += "\r\n";
        });
    
        window.open('data:application/vnd.ms-excel,' + encodeURIComponent(CsvString));
    }
    

    更新

    我只是偶然发现,1。2.和4.可以通过将vnd.ms-excel替换为csv来解决。

    该文件不再是.xls,但可以通过Excel打开csv而不会出现问题,并且表现得像预期的那样。

    只剩下问题是文件名!

    更新2

    经过2个完整的搜索和尝试工作日后,我找到了解决方案,我想在这里分享,以帮助任何有同样问题的人:

    只需包含一个不可见的<a>元素,该元素使用其download="somedata.csv"属性为文件定义一个有用的名称。

    这是我最后一个功能齐全的小提琴:

    https://jsfiddle.net/3an24jmw/25/

2 个答案:

答案 0 :(得分:6)

经过2个完整的搜索和尝试工作日后,我找到了解决方案,我想在这里分享,以帮助任何有同样问题的人:

只需包含一个不可见元素,该元素使用download =“somedata.csv”属性为文件提供有用的名称:

这是我最后一个功能齐全的小提琴:

https://jsfiddle.net/3an24jmw/25/

var Results = [
["Col1", "Col2", "Col3", "Col4"],
["Data", 50, 100, 500],
["Data", -100, 20, 100],
];

exportToCsv = function() {
  var CsvString = "";
  Results.forEach(function(RowItem, RowIndex) {
    RowItem.forEach(function(ColItem, ColIndex) {
      CsvString += ColItem + ',';
    });
    CsvString += "\r\n";
  });
  CsvString = "data:application/csv," + encodeURIComponent(CsvString);
  var x = document.createElement("A");
  x.setAttribute("href", CsvString );
  x.setAttribute("download","somedata.csv");
  document.body.appendChild(x);
  x.click();
}

答案 1 :(得分:0)

Excel对csv的期望值取决于列表分隔符的系统区域设置。 您可以通过添加"sep=,"作为第一行来提示Excel使用哪个分隔符用于csv文件。 在您的情况下,使用可以使用:var CsvString = '"sep=,"\r\n';