【发布时间】:2016-01-08 19:02:00
【问题描述】:
我需要将 HTML 报告导出到各种不同浏览器中的 excel(最好仅在客户端上)。我已经在这个问题上投入了大量时间,并且我为 IE10+ 和 FF/Chrome 提供了工作的、特定于浏览器的解决方案。我正在寻找一个跨浏览器的解决方案,因为我对特定于浏览器的代码感到畏缩。
var saveData = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, fileName) {
var html = data,
blob = new Blob([html], { type: "text/xml" }),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
var fileName = "download.xls"
saveData($('#TablesContainer').html(), fileName);
http://codepen.io/mhodges44/pen/dGWZvN
此解决方案在 FF/Chrome 中运行,并且主要在 IE 中运行,但我在执行 a.click() 时收到以下错误:“SCRIPT5:访问被拒绝。”我之前在 IE11 中以编程方式触发了点击事件,所以我不确定它为什么拒绝执行。它与文件下载的 XSS 安全性有关吗?
请不要使用“window.open(‘data:application….’)”解决方案或 navigator.msSaveBlob() 解决方案进行响应,因为它们不兼容跨浏览器。
最坏的情况,我只留下浏览器特定的代码,但希望有一个我没有看到或想到的解决方案。
谢谢大家!
【问题讨论】:
-
为什么不直接使用 FileSaver.js?或者您是否正在推出自己的体验解决方案
-
我看过 FileSaver.js。老实说,我们的项目本身就相当庞大,所以我尽量避免在一个库之后添加库。特别是因为这个问题在我们的应用程序中是一个非常小的用例。如果有一个不使用第三方库的简单解决方案,那将是首选。否则我肯定愿意接受。
-
IE 具有相当高的安全性,触发对隐藏锚点的点击是不行的,但这不是问题,因为 IE 不支持锚标记上的下载属性。
-
无论如何,正如良好的 OOP 实践所建议的那样,我将封装您打算使用的 FileSaver.js 库中的功能。除非项目大小,否则在这种情况下,您的意思是“总文件大小”为跨浏览器的适用性(并复制相关部分)倾注他们的代码可能是个好主意
-
明白。多谢你们。我所说的项目大小只是整个应用程序 - 所涉及的文件数量。添加另一个小型用例库并不是世界末日,但如果可以的话,我希望避免这样做。我将解析这些文件,看看我是否无法弄清楚它们在做什么并提取出我需要的东西。
标签: javascript excel internet-explorer-11 access-denied