我正在尝试从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打开或修复。已损坏”。
使我的代码正常工作的任何帮助或建议或解决方法。
在此先感谢!!! ..
答案 0 :(得分:0)
在工作时,我现在无法做一个项目并尝试使用excel库,所以我做得很快。
首先,我认为您可以完全不用使用ajax
。总是很好,因为不需要维护代码,可以使用普通的anchor标签:
<a href="@Url.Action("GetExcelDocument", "MyController", new {id = Model.ExcelFileId})">Download</a>
这不会重定向页面,因为浏览器应该解释内容处置/ MIME类型,然后下载文件。
然后,您可以尝试像这样返回文件,首先在该文件中读取文件(在本例中为stream
,但您既可以使用byte[]
也可以使用{{1} }对此有重载),然后使用File
和File
通过控制器将其返回。
例如:
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