Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Excel导出不在MVC中工作。没有抛出错误_Excel_Asp.net Mvc_Export - Fatal编程技术网

Excel导出不在MVC中工作。没有抛出错误

Excel导出不在MVC中工作。没有抛出错误,excel,asp.net-mvc,export,Excel,Asp.net Mvc,Export,我正在尝试将数据库中的所有用户导出到excel文件 在运行这段代码并进行调试之后,我没有遇到任何错误,LetsExcelAll()方法一直被命中并运行。不知道我错过了什么。当代码运行完成时,不会遇到任何错误,也不会开始下载 控制器: public void LetsExcelAll() { try { var userRepo = new UsersRepository(); XLWorkbook wb =

我正在尝试将数据库中的所有用户导出到excel文件

在运行这段代码并进行调试之后,我没有遇到任何错误,LetsExcelAll()方法一直被命中并运行。不知道我错过了什么。当代码运行完成时,不会遇到任何错误,也不会开始下载

控制器:

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) 在AJAX
POST
响应中设置
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();
    }
}