Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
C# 动态创建Excel文件并在客户端下载/保存_C#_Asp.net Core_Export To Excel_Epplus - Fatal编程技术网

C# 动态创建Excel文件并在客户端下载/保存

C# 动态创建Excel文件并在客户端下载/保存,c#,asp.net-core,export-to-excel,epplus,C#,Asp.net Core,Export To Excel,Epplus,问题:ASP.NET Core 1.1中以下代码的最后三行的替代方案是什么和/或解决方法是什么?在最后三行中,VS2015正在抱怨HttpResponse不包含OutputStream、Flush()、End()的定义 Background:在我的ASP.NET Core 1.1应用程序中,我正在使用它将数据实时导出到Excel,并在客户端下载/保存数据。作为初学者,我试图模仿以下示例(摘自),但VS2015无法识别此代码的最后3行 public void ExportListUsingEPPl

问题:ASP.NET Core 1.1中以下代码的最后三行的替代方案是什么和/或解决方法是什么?在最后三行中,
VS2015
正在抱怨
HttpResponse不包含OutputStream、Flush()、End()的定义

Background:在我的
ASP.NET Core 1.1
应用程序中,我正在使用它将数据实时导出到Excel,并在客户端下载/保存数据。作为初学者,我试图模仿以下示例(摘自),但
VS2015
无法识别此代码的
最后3行

public void ExportListUsingEPPlus()
{
    var data = new[]{
                        new{ Name="Ram", Email="ram@techbrij.com", Phone="111-222-3333" },
                        new{ Name="Shyam", Email="shyam@techbrij.com", Phone="159-222-1596" },
                        new{ Name="Mohan", Email="mohan@techbrij.com", Phone="456-222-4569" },
                        new{ Name="Sohan", Email="sohan@techbrij.com", Phone="789-456-3333" },
                        new{ Name="Karan", Email="karan@techbrij.com", Phone="111-222-1234" },
                        new{ Name="Brij", Email="brij@techbrij.com", Phone="111-222-3333" }
                };

    ExcelPackage excel = new ExcelPackage();
    var workSheet = excel.Workbook.Worksheets.Add("Sheet1");
    workSheet.Cells[1, 1].LoadFromCollection(data, true);
    using (var memoryStream = new MemoryStream())
    {
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.Headers.Add("content-disposition", "attachment;  filename=Contact.xlsx");
        excel.SaveAs(memoryStream);
        memoryStream.WriteTo(Response.OutputStream);
        Response.Flush();
        Response.End();
    }
}
您可以在控制器操作中返回其中一个

它返回指定文件流中的文件,其中指定的contentType作为内容类型,指定的fileDownloadName作为建议的文件名

public virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)

编辑:

样品作用法-

var data = new[]{
                        new{ Name="Ram", Email="ram@techbrij.com", Phone="111-222-3333" },
                        new{ Name="Shyam", Email="shyam@techbrij.com", Phone="159-222-1596" },
                        new{ Name="Mohan", Email="mohan@techbrij.com", Phone="456-222-4569" },
                        new{ Name="Sohan", Email="sohan@techbrij.com", Phone="789-456-3333" },
                        new{ Name="Karan", Email="karan@techbrij.com", Phone="111-222-1234" },
                        new{ Name="Brij", Email="brij@techbrij.com", Phone="111-222-3333" }
                };

            ExcelPackage excel = new ExcelPackage();
            var workSheet = excel.Workbook.Worksheets.Add("Sheet1");
            workSheet.Cells[1, 1].LoadFromCollection(data, true);

            //var memoryStream = new MemoryStream(excel.GetAsByteArray());

            //Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            //Response.Headers.Add("content-disposition", "attachment;  filename=Contact.xlsx");
            //excel.SaveAs(memoryStream);
            //memoryStream.WriteTo(Response.OutputStream);
            //Response.Flush();
            //Response.End();

            return File(excel.GetAsByteArray(), "application/vnd.ms-excel", "Contact.xlsx");
生成的Excel屏幕截图-


根据您的建议,它会给出错误:
无法访问封闭流
。这可能是因为
使用{…}
语句在末尾关闭流。但是在我使用{…}
删除
之后,它现在下载一个没有数据的Excel文件。我用
返回文件(memoryStream,“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”,“Contact.xlsx”)替换了最后3行试试这个-
新的内存流(excel.GetAsByteArray())我使用了
var memoryStream=newmemorystream(excel.GetAsByteArray())
然后在第
excel.SaveAs(memoryStream)行得到错误:无法访问封闭流。您不必调用
。SaveAs
bcoz
。GetAsByteArray
在内部执行此操作。我可能没有按照您期望的方式进行测试。它似乎在你这边起作用。请您复制/粘贴我的代码,并根据我们到目前为止的讨论对其进行修改,好吗?我会试着让你知道它是否有效。你只是不断地问同一个问题,不同的选择(一旦是csv,现在是excel文件)。如果它可以接受
,则始终可以执行
新建ExcelPackage(HttpContext.Response.Body)
。只要流的写入是只向前的(没有倒带,因为在大多数情况下,您直接写入到用户浏览器的wire/TCP连接),并且(至少是非官方的)EPPlus包确实具有该构造函数(请参阅源代码),并且您可能必须调用
Save()
method,或者只需执行
excel.SaveAs即可(HttpContext.Response.Body)
w/o首先是
MemoryStream
。当您可以直接写入响应流时,为什么要浪费内存?您只需了解以前的问题解决方案,并在将来应用它们,而不是每次都要求复制粘贴就绪的代码