2

我们有以 HTML 格式生成的报告,我们的用户经常在 Excel 中打开这些报告,我们通过使用 content-type 来提供足够简单的服务。然而,我们最近有一个皱纹弹出:其中一些报表使用大量的 Javascript 进行动态分组/排序,用户希望将这个“完成”版本的报表下载到 Excel 中。我有一个功能正常的Javascript函数:

var uri = 'data:application/vnd.ms-excel;base64,';
var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">';
template += '<head></head>';
template += '<body><table>{table}</table></body></html>';
var base64 = function(s) { 
    return window.btoa(unescape(encodeURIComponent(s)));
};
var format = function(s, c) { 
    return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; });
};
var ctx = {worksheet: name || 'Worksheet', table: daBody};
window.location.href = uri + base64(format(template, ctx));

我发现 IE 不支持 window.btoa,所以我解决了这个问题,但现在尝试在 Excel 中打开数据时出现以下错误:

传递给系统调用的数据区域太小。

我相信,尽管有消息,这是由于 URI 中的 base64 字符串太长(我过去看到 IE 不接受极长的 URL,并相信这是连接的)。

那么,有没有人可以在 IE 中使用任何替代方法?

4

1 回答 1

2

找到了一种有效的方法:

  1. 使用 jQuery 创建表单,收集页面的所有 HTML(在 Javascript 完成后)并将其发布到我的服务器
  2. 在我的服务器上,我创建了一个函数,该函数接受表单 post 并以“application/msexcel”的返回类型返回它
  3. 添加脚本以在报告页面的 window.load 上运行此 Javascript

它非常hacky,但它在所有浏览器中都像冠军一样工作

于 2013-02-14T14:15:44.397 回答