Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用Blob导出Excel在FireFox中不起作用_Javascript_Excel_Firefox_Export To Excel - Fatal编程技术网

在JavaScript中使用Blob导出Excel在FireFox中不起作用

在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中工

我有一些JavaScript代码,如第一个代码片段中所示,可以在最新的Chrome中使用,但不能在最新的FireFox中使用。此代码正在使用Blob对象将数据导出到
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);