【问题标题】:Exporting HTML To Excel in IE11 – "Access is Denied"在 IE11 中将 HTML 导出到 Excel – “访问被拒绝”
【发布时间】: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


【解决方案1】:
if window.navigator and window.navigator.msSaveOrOpenBlob
      blob = new Blob([ data ], type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
      window.navigator.msSaveOrOpenBlob blob
else 
      blob = new Blob([ data ], type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
      objectUrl = URL.createObjectURL(blob)
      window.open objectUrl

【讨论】:

  • 我最终使用了 filesaver.js。我提取了我需要的代码部分,导出文件的代码本身是 1 行。我想要一个不需要我手动检测浏览器并运行不同代码的解决方案。不过谢谢
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多