C# 动态创建Excel文件并在客户端下载/保存
问题:ASP.NET Core 1.1中以下代码的最后三行的替代方案是什么和/或解决方法是什么?在最后三行中,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
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
。当您可以直接写入响应流时,为什么要浪费内存?您只需了解以前的问题解决方案,并在将来应用它们,而不是每次都要求复制粘贴就绪的代码