我知道,这里有数百个关于这个主题的问题,但经过一天的搜索,我仍然找不到满意的答案:
我有一个 2D javascript 数组,我想将其下载为 Excel 工作表。
这是我迄今为止得到的代码的一个摆弄:
https://jsfiddle.net/3an24jmw/7/
下载可以,但是有几个问题,经过几天的尝试后无法解决:
.xls
结尾 (.xls.xls
)。如何获得单一.xls
结局?对于这些问题的任何帮助,我们将不胜感激。
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"
属性为文件定义一个有用的名称。
这是我最终的、功能齐全的小提琴:
经过整整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();
}
Excel 对 csv 期望的分隔符取决于列表分隔符的系统区域设置。 您可以通过添加
"sep=,"
作为第一行来提示 Excel 将哪个分隔符用于 csv 文件。
在您的情况下,可以使用:var CsvString = '"sep=,"\r\n';
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>