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

问题描述 投票:0回答:3

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

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

这是我迄今为止得到的代码的一个摆弄:

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

下载可以,但是有几个问题,经过几天的尝试后无法解决:

  1. 所有项目最终都位于 Excel 工作表的第一列中,因为 Excel 将分隔元素的“,”解释为数据的一部分。如何以 Excel 能够理解的方式分离元素?
  2. 文件名是一些神秘的代码。如何设置文件名?
  3. 下载的文件有一个双
    .xls
    结尾 (
    .xls.xls
    )。如何获得单一
    .xls
    结局?
  4. 每次文件可能已损坏或不安全时,Excel 都会告诉我。我该如何预防这种情况?

对于这些问题的任何帮助,我们将不胜感激。

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
,但 csv 可以通过 Excel 打开,没有任何问题,并且表现如预期。

剩下的唯一问题是文件名!

更新2

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

只需包含一个不可见的

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

这是我最终的、功能齐全的小提琴:

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

javascript html excel export-to-excel window.open
3个回答
25
投票

经过整整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();
}

0
投票

Excel 对 csv 期望的分隔符取决于列表分隔符的系统区域设置。 您可以通过添加

"sep=,"
作为第一行来提示 Excel 将哪个分隔符用于 csv 文件。 在您的情况下,可以使用:
var CsvString = '"sep=,"\r\n';


-1
投票

https://github.com/shuchkin/simplexlsxgen#js-array-to-excel-ajax

<?php // array2excel.php
if (isset($_POST['array2excel'])) {
    require __DIR__.'/simplexlsxgen/src/SimpleXLSXGen.php';
    $data = json_decode($_POST['array2excel'], false);
    \Shuchkin\SimpleXLSXGen::fromArray($data)->downloadAs('file.xlsx');
    return;
}
?>
<html lang="en">
<head>
    <title>JS array to Excel</title>
</head>
<script>

function array2excel() {
    var books = [
        ["ISBN", "title", "author", "publisher", "ctry"],
        [618260307, "The Hobbit", "J. R. R. Tolkien", "Houghton Mifflin", "USA"],
        [908606664, "Slinky Malinki", "Lynley Dodd", "Mallinson Rendel", "NZ"]
    ];
    var json = JSON.stringify(books);

    var request = new XMLHttpRequest();

    request.onload = function () {
        if (this.status === 200) {
            var file = new Blob([this.response], {type: this.getResponseHeader('Content-Type')});
            var fileURL = URL.createObjectURL(file);
            var filename = "", m;
            var disposition = this.getResponseHeader('Content-Disposition');
            if (disposition && (m = /"([^"]+)"/.exec(disposition)) !== null) {
                filename = m[1];
            }
            var a = document.createElement("a");
            if (typeof a.download === 'undefined') {
                window.location = fileURL;
            } else {
                a.href = fileURL;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
            }
        } else {
            alert("Error: " + this.status + "  " + this.statusText);
        }
    }
    
    request.open('POST', "array2excel.php");
    request.responseType = "blob";
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send("array2excel=" + encodeURIComponent(json));
}
</script>
<body>
<input type="button" onclick="array2excel()" value="array2excel" />
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.