Excel导出不在MVC中工作。没有抛出错误
我正在尝试将数据库中的所有用户导出到excel文件 在运行这段代码并进行调试之后,我没有遇到任何错误,LetsExcelAll()方法一直被命中并运行。不知道我错过了什么。当代码运行完成时,不会遇到任何错误,也不会开始下载 控制器:Excel导出不在MVC中工作。没有抛出错误,excel,asp.net-mvc,export,Excel,Asp.net Mvc,Export,我正在尝试将数据库中的所有用户导出到excel文件 在运行这段代码并进行调试之后,我没有遇到任何错误,LetsExcelAll()方法一直被命中并运行。不知道我错过了什么。当代码运行完成时,不会遇到任何错误,也不会开始下载 控制器: public void LetsExcelAll() { try { var userRepo = new UsersRepository(); XLWorkbook wb =
public void LetsExcelAll()
{
try
{
var userRepo = new UsersRepository();
XLWorkbook wb = null;
wb = userRepo.DownloadUsers();
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=Users.xlsx");
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();
}
}
catch(Exception ex)
{
throw ex;
}
}
回购:
视图:(我如何调用该方法)
不能直接将文件作为方法的响应返回。需要将文件作为字节数组存储在
TempData
或Session
状态,并将其传递给另一个标记为HttpGetAttribute
的控制器,以便用户下载该文件
以下是要执行的步骤:
1) 更改LetsExcelAll
方法以返回包含文件名的JsonResult
,并将MemoryStream
的输出存储在TempData
/会话
变量中,具体键如下所示
[HttpPost]
public ActionResult LetsExcelAll()
{
try
{
var userRepo = new UsersRepository();
XLWorkbook wb = null;
wb = userRepo.DownloadUsers();
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
// set stream to starting position
MyMemoryStream.Position = 0;
// store file contents inside TempData
TempData["ExcelFile"] = MyMemoryStream.ToArray();
}
// return file name as JSON data
return new JsonResult() { Data = new { FileName = "Users.xlsx", Status = "Success" } };
}
catch(Exception ex)
{
throw ex;
}
return new JsonResult() { Data = new { Status = "Nothing" } };
}
2) 在AJAXPOST
响应中设置window.location
,将文件名作为查询字符串参数传递给使用GET
的操作方法名(假定downloadAllUsers
是一个按钮元素)
3) 使用文件名作为输入参数,使用HttpGetAttribute
创建一个新控制器,并从中返回FileResult
[HttpGet]
public ActionResult DownloadFile(string fileName)
{
if (TempData["ExcelFile"] != null)
{
var data = TempData["ExcelFile"] as byte[];
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
return File(data, contentType, fileName);
}
else
{
// if TempData messing up, return nothing
return new EmptyResult();
}
}
从这一点来看,文件下载应该可以正常工作
相关问题:
如何调用内部控制器/代码隐藏?如果在MVC控制器中调用它,您应该返回
FileStreamResult
,而不是手动设置Response
头。它是通过jquery中的视图调用的。您如何从视图调用该方法?仍然不清楚您使用的是什么视图引擎,以及为什么void
用作方法返回类型,而不是ActionResult
或FileResult
。从视图中添加了downloadAllUsers
按钮元素调用方法的代码?问题似乎很清楚:您正在启动AJAX请求来调用void
方法,这就是为什么它不下载任何东西。要下载文件,您需要启动GET请求(不是来自AJAX),该请求以文件名为参数返回FileResult
。感谢您的帮助,但使用该代码,我现在收到一个jquery错误…VM33:1未捕获的语法错误:JSON中的意外标记o位于Object.success的JSON.parse()位置1处(AllUsers:2502)(这是导致错误的行)var response=JSON.parse(data);意外标记o
表示响应已经是一个对象。无需使用JSON.parse
,只需使用data.Status
即可显示响应状态。
[HttpPost]
public ActionResult LetsExcelAll()
{
try
{
var userRepo = new UsersRepository();
XLWorkbook wb = null;
wb = userRepo.DownloadUsers();
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
// set stream to starting position
MyMemoryStream.Position = 0;
// store file contents inside TempData
TempData["ExcelFile"] = MyMemoryStream.ToArray();
}
// return file name as JSON data
return new JsonResult() { Data = new { FileName = "Users.xlsx", Status = "Success" } };
}
catch(Exception ex)
{
throw ex;
}
return new JsonResult() { Data = new { Status = "Nothing" } };
}
$("#downloadAllUsers").click(function () {
$.post("/Users/LetsExcelAll", function(data) {
if (data.Status == "Success") {
window.location = '/Users/DownloadFile?fileName=' + data.FileName;
}
});
});
[HttpGet]
public ActionResult DownloadFile(string fileName)
{
if (TempData["ExcelFile"] != null)
{
var data = TempData["ExcelFile"] as byte[];
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
return File(data, contentType, fileName);
}
else
{
// if TempData messing up, return nothing
return new EmptyResult();
}
}