通过MVC ajax

时间:2019-05-21 16:28:28

标签: ajax excel asp.net-mvc

我正在尝试从MVC Ajax调用中下载Excel文件,但是每次下载时,由于文件已损坏,我无法打开文件。

以下是我的Ajax通话:

function Download() {
$.ajax({
    url: '/Home/ExcelDownload',
    type: "POST",
    success: function (result) {            

        if (result !== null || result !== "") {
            $('<iframe src=' + result + ' frameborder="0" scrolling="no" id="myFrame"></iframe>')
                .appendTo('body');
        }
        //var iframe = document.getElementById('invisible');
        //iframe.src = result;
    },
    error: function (data) {

    }
});}

在我的控制器中,我这样调用action方法:

string host = Request.Url.Authority;
        return Json("http://" + host + "/ExcelTemplates/EInvoiceTemplateNew.xlsm");

我也在Excel中启用了宏。

文件下载正确,但是当我尝试打开文件时,它警告我来自受信任的来源,然后单击“是”,出现另一个对话框,提示“该工作簿无法通过Microsoft excel打开或修复。已损坏”。

使我的代码正常工作的任何帮助或建议或解决方法。

在此先感谢!!! ..

1 个答案:

答案 0 :(得分:0)

在工作时,我现在无法做一个项目并尝试使用excel库,所以我做得很快。

首先,我认为您可以完全不用使用ajax。总是很好,因为不需要维护代码,可以使用普通的anchor标签:

<a href="@Url.Action("GetExcelDocument", "MyController", new {id = Model.ExcelFileId})">Download</a>

这不会重定向页面,因为浏览器应该解释内容处置/ MIME类型,然后下载文件。

然后,您可以尝试像这样返回文件,首先在该文件中读取文件(在本例中为stream,但您既可以使用byte[]也可以使用{{1} }对此有重载),然后使用FileFile通过控制器将其返回。

例如:

FileResult

This网站说.xlsm的内容类型/ MIME为“ application / vnd.ms-excel.sheet.macroEnabled.12”,但我认为public FileResult GetExcelDocument(int id) { string filePath = GetPathToDocumentWithId(id); //However you get the excel file path return File(System.IO.File.OpenRead(filePath), System.Web.MimeMapping.GetMimeMapping(filePath), "filename.xlsm"); } 应该可以。

(可选)如果要在新标签页中下载文件,可以将锚标签的GetMimeMapping设置为“ _blank”,它应该打开一个新标签页并在此处下载文件。

让我知道结果是什么。

如果您打算使用JQuery和Ajax,我会发现以下示例与您先前的尝试相同:

来自Here

target