Html导出到Excel - 浏览器直接保存excel,无法打开"查看"模式,使用IE9

时间:2016-04-19 13:48:43

标签: javascript jquery html excel

我使用IE9将html表导出为ex​​cel,我使用以下js代码导出我的表工作正常,但我遇到的问题是,

单击导出图标时,浏览器会直接显示saveAs选项,强制用户在打开excel之前保存excel,它不允许在{{1}中打开excel }。

我的js功能:

view

单击导出图标时,会显示以下对话框: enter image description here

我需要的是:

enter image description here

任何人都可以帮我从浏览器中获取上述对话框。非常感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

由于您使用Java作为后端,因此您需要在后端创建Java Web服务或者提供适当的servlet;无论哪种方式,您都需要在下面的代码中更改jquery ajax调用中的url参数。

我在ASP.Net和IE 9中测试了下面的jQuery代码,其中弹出了一个打开或保存下载文件的对话框。所以这应该符合你的要求。

您可以使用下面的代码,其中导出文件的html字符串和文件名将被发布到后端。

  1. 后端servlet或Web服务应该有一个方法,它将使用这两个参数在后端的某个文件夹下创建一个unique name的文件,并返回所创建文件的完整绝对URL。
  2. 在下面的代码示例中,此方法是名为DownloadFile
  3. 的Web服务方法
  4. 当对此后端的调用返回时,您将拥有导出文件的URL,可以通过将窗口的href设置为此URL来轻松下载。
  5. 另外,请记住,即使fileName作为参数传递给后端,您也需要确保将其转换为唯一的文件名。这是必要的,否则不同的用户可能最终会过度编写彼此的文件。
  6. 例如,如果将exportExcel.xls传递给后端,则可以将GUID字符串附加到文件名,以便文件名变为:excelExport_bb1bf56eec4e4bc8b874042d1b5bd7da.xls。这将使文件名始终唯一。
  7. 通过发布到后端导出到Excel的jQuery代码

        function ExportToExcel() {
    
        //create the html to be exported to Excel in any custom manner you like
        //here it's simply being set to some html string  
        var exportString = "<html><head><style>
        table, td {border:thin solid black} table {border-collapse:collapse}
        </style></head><body><table><tr><td>Product</td><td>Customer</td></tr>
        <tr><td>Product1</td><td>Customer1</td></tr><tr><td>Product2</td><td>Customer2</td>
        </tr><tr><td>Product3</td><td>Customer3</td></tr><tr><td>Product4</td>
        <td>Customer4</td></tr></table></body></html>";
    
        //set the file name with or without extension
        var fileName = "excelExport.xls";
        var exportedFile = { filePath: "", deleteFileTimer: null };
    
        //make the ajax call to create the Excel file
        $.ajax({
            url: "http://localhost/disera/ExportWebService/DownloadFile",
            type: "POST",
            data: JSON.stringify({ htmlString: exportString, fileName: fileName }),
            contentType: "application/json",
            async: true,
            success: function (data) {
                window.location.href = data.d;
                var exportedFile = { filePath: data.d, deleteFileTimer: null };
    
                //the line of code below is not necessary and you can remove it
                //it's being used to delete the exported file after it's been served
                //NOTE: you can use some other strategy for deleting exported files or
                //choose to not delete them
                DeleteFile(exportedFile);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("Following error occurred when exporting data to '" +
                        exportedFile.filePath + "' : " + thrownError);
            }
        });
    
    }
    
    function DeleteFile(exportedFile) {
        exportedFile.deleteFileTimer = setInterval(function () {
            $.ajax({
                url: "http://localhost/disera/ExportWebService/DeleteFile",
                type: "POST",
                data: JSON.stringify({ filePath: exportedFile.filePath }),
                contentType: "application/json",
                async: true,
                success: function (data) {
                    if (data.d === true) {
                        clearInterval(exportedFile.deleteFileTimer);
                        exportedFile.deleteFileTimer = null;
                        exportedFile.filePath = null;
                        exportedFile = null;
                    }
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    // alert("Following error occurred when deleting the exported file '" +
                    // exportedFile.filePath + "' : " + thrownError);
                }
            });
        }, 30000)
    }