2012-09-12 200 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