2012-09-12 41 views
1

我在内存中使用MemoryStream API和EPPlus创建excel文件以创建excel文档。强制下载流 - 强制下载excel文件

我创建一个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; 
} 

然后我其他的功能应该服务于这个流作为下载到用户。我试图这样做:

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文档充满垃圾(我猜二进制数据表示为一个字符串)。

我不知道我做错了什么。

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

回答

2

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

因此改变这一行:

using (ExcelPackage p = new ExcelPackage(stream)) 

这样:

using (ExcelPackage p = new ExcelPackage()) 
+0

谢谢,这对我来说伎俩! – Vivendi

0

对于'Response.ContentType'使用application/octet-stream作为类型。这会告诉大多数浏览器将文件视为不应该下载的数据。

+0

不幸的是,这仍然给我的二进制字符串数据在我的Excel文件。 – Vivendi