强制下载一个stream – 强制下载excel文件

我正在使用MemoryStream API和EPPlus创build一个Excel文档,在内存中创build一个Excel文件。

我创build一个Excel文件的代码基本上是这样的:

 public Stream GetXlsDocument(IQueryable data) { const string sheetName = "Sheet1"; var file = new FileInfo("test2.xls"); MemoryStream stream = new MemoryStream(); using (ExcelPackage p = new ExcelPackage(stream)) { p.Workbook.Worksheets.Add(sheetName); ExcelWorksheet ws = p.Workbook.Worksheets[1]; ws.Name = sheetName; ws.Cells.Style.Font.Size = 11; ws.Cells.Style.Font.Name = "Calibri"; // Headers ws.SetValue(1, 1, "Some data"); p.SaveAs(stream); } stream.Position = 0; return stream; } 

然后,我的其他function应该为此用户提供下载。 我试图这样做:

 var file = Documents.GetXlsDocument(); var memoryStream = new MemoryStream(); file.CopyTo(memoryStream); Response.Clear(); Response.ContentType = "application/force-download"; Response.AddHeader("content-disposition", "attachment; filename=nfile.xls"); Response.BinaryWrite(memoryStream.ToArray()); Response.End(); 

这显示了一个下载对话框。 但是,当我打开我的Excel文件,然后整个Excel文件充满了垃圾(我猜二进制数据表示为一个string)。

我不知道我做错了什么。

任何人有任何想法如何我可以使excel文件以良好的格式下载? 也许EPPlus已经有这个东西了?

不要在构造函数中添加stream。 保持构造器为空。

所以改变这一行:

 using (ExcelPackage p = new ExcelPackage(stream)) 

对此:

 using (ExcelPackage p = new ExcelPackage()) 

对于“Response.ContentType”,使用application/octet-stream作为types。 这将告诉大多数浏览器将文件视为数据,它应该下载没有别的。