在JavaScript中使用Blob导出Excel在FireFox中不起作用
我有一些JavaScript代码,如第一个代码片段中所示,可以在最新的Chrome中使用,但不能在最新的FireFox中使用。此代码正在使用Blob对象将数据导出到在JavaScript中使用Blob导出Excel在FireFox中不起作用,javascript,excel,firefox,export-to-excel,Javascript,Excel,Firefox,Export To Excel,我有一些JavaScript代码,如第一个代码片段中所示,可以在最新的Chrome中使用,但不能在最新的FireFox中使用。此代码正在使用Blob对象将数据导出到xls文件。奇怪的是,在FireFox中,代码没有抛出任何错误,但在成功执行所有行时什么也不做,即没有发生导出 此问题的演示位于以下URL: 如果您在Chrome中运行上述演示中的代码,它将下载文件newfile.xls(允许在Chrome中弹出窗口) 问题:我需要在下面给出的Blob code中做什么更改才能使它在FireFox中工
xls
文件。奇怪的是,在FireFox中,代码没有抛出任何错误,但在成功执行所有行时什么也不做,即没有发生导出
此问题的演示位于以下URL:
如果您在Chrome中运行上述演示中的代码,它将下载文件newfile.xls
(允许在Chrome中弹出窗口)
问题:我需要在下面给出的Blob code
中做什么更改才能使它在FireFox中工作?我尝试使用类型:“应用程序/八位字节流”
和类型:“文本/普通”
,但这两种方法在FireFox中都不起作用
下面代码片段中的变量table
包含一个字符串,该字符串是用于呈现包含html和body标记的表的html
用于导出的Blob代码(不适用于FireFox)
我知道Blob和CSV导出的问题。我的解决方案:创建一个数组并将其发布到后端脚本。然后,您只需创建Excel、CSV、PDF等文件。我的问题的答案如下所述 问题是调用window.URL.revokeObjectURL(URL)行太快,FireFox无法响应.click()并显示其文件对话框。因此,我只是通过对line window.URL.revokeObjectURL(URL)使用setTimeout添加了一个延迟。这一改变使它在FireFox中工作。当然,它在Chrome中也起作用 更新后的代码如下所示,最后一行代码中只有一处更改。另外,在FireFox中使用此更改的演示是: 用于导出的Blob代码(在FireFox和Chrome中适用) 虽然上面的代码工作得很好,但我认为在导出到xls文件时,最好使用type:'application/vnd.ms-excel,即使table变量包含html字符串 这一小改动使FireFox自动使用Excel作为打开导出文件的默认程序,否则FireFox将使用Laucnch Windows app(默认)打开该文件。我笔记本电脑上的默认应用程序是Edge browser
var myBlob = new Blob( [table] , {type:'application/vnd.ms-excel'});
如果您希望在较旧的IE浏览器中使用100%客户端方法,则不能使用Blob
对象,因为它在较旧的IE浏览器中不可用,但您可以使用另一种方法,如下面的代码片段所示
在IE 0中将Html导出为Excel)//如果旧的Internet Explorer包括IE 8
{
//确保页面中有一个id为iframeDiv的空div
document.getElementById('iframeDiv')。innerHTML='';
打开(“txt/html”,“replace”);
txtArea1.文件.写入(表格);
txtArea1.document.close();
txtArea1.focus();
sa=txtArea1.document.execCommand(“SaveAs”,true,“DataExport.xls”);
document.getElementById('iframeDiv')。innerHTML=“”;
}
返回(sa);
}
要使上述特定于IE的代码正常工作,请在页面标记中添加以下内容
在旧IE浏览器中导出时需要空Div
<div id='iframeDiv'></div>
您可以尝试将锚点添加到dom,如下所示:
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
在我的案例中,我一直在寻找一个客户端专用的解决方案。你的方法会奏效,但不是100%的客户端方法。Firefox会发生什么?没有错误。它只是遍历blob代码,什么也不做。我刚刚发现了这个问题,并在
update1
下发布了解决方案。有没有一种方法可以不使用Blob
导出excel(html表格),因为IE9和更低版本不支持它。请提出一个想法!谢谢,是的。Javascript数组->HTTP POST to Backend Service->序列化->to Excel感谢Sunil,使用此方法我们可以立即保存Excel,请告诉我们,应该如何使用这些选项向用户(打开/保存/另存为)发出警报消息。非常感谢您的帮助。@Disera,保存文件
对话框依赖于浏览器。较旧的IE浏览器应自动弹出此对话框。您不需要编写任何代码来显示此对话框。我使用IE9,并且我没有为(打开/保存/另存为)获得此弹出窗口,我直接获得保存
对话框。你能告诉我哪里出了问题吗?还有,你能告诉我,有没有办法避免某个特定的列
被导出到excel,比如使用它的id?@Disera,这个对话框会在IE浏览器和其他浏览器中显示。如果代码正确,浏览器将自动显示此对话框。如果您没有看到此对话框,请发布您的代码并说明对话框未显示在哪个浏览器中。如果您没有看到此对话框,那么代码中一定有错误/bug。
function ExportTabletoExcelInOldIE(table)
{
//table variable contains the html to be exported to Excel
var sa = null;
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
if (msie > 0) // If old Internet Explorer including IE 8
{
//make sure you have an empty div with id of iframeDiv in your page
document.getElementById('iframeDiv').innerHTML = '<iframe id="txtArea1" style="display:none"></iframe>';
txtArea1.document.open("txt/html", "replace");
txtArea1.document.write(table);
txtArea1.document.close();
txtArea1.focus();
sa = txtArea1.document.execCommand("SaveAs", true, "DataExport.xls");
document.getElementById('iframeDiv').innerHTML = "";
}
return (sa);
}
<div id='iframeDiv'></div>
document.body.appendChild(a);
a.click();
document.body.removeChild(a);