2017-06-03 66 views
0

問題:什麼是ASP.NET Core1.1中以下代碼的最後三行的替代方法和/或什麼是解決方法?在這些最後三行VS2015抱怨HttpResponse does not contain a definition for OutputStream, Flush(), End()即時創建Excel文件並將其下載/保存到客戶端

背景:在我ASP.NET Core 1.1應用我使用EPPlus.Core將數據導出在飛行到Excel,並把它下載/保存在客戶端。作爲首發,我試圖模仿下面的例子(從here拍攝),但VS2015是不承認這段代碼的last 3 lines

public void ExportListUsingEPPlus() 
{ 
    var data = new[]{ 
         new{ Name="Ram", Email="[email protected]", Phone="111-222-3333" }, 
         new{ Name="Shyam", Email="[email protected]", Phone="159-222-1596" }, 
         new{ Name="Mohan", Email="[email protected]", Phone="456-222-4569" }, 
         new{ Name="Sohan", Email="[email protected]", Phone="789-456-3333" }, 
         new{ Name="Karan", Email="[email protected]", Phone="111-222-1234" }, 
         new{ Name="Brij", Email="[email protected]", 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(); 
    } 
} 
+0

你只是不斷地問不同的輪換(一旦它是csv,現在是一個excel文件)相同的問題。如果它可以接受'Stream',你總是可以做'新的ExcelPackage(HttpContext.Response.Body)'。只要流的寫作是隻向前它將工作(不收卷,因爲你是在大多數情況下直接寫入線/ TCP連接到用戶的瀏覽器)和(非官方至少)EPPlus包確實有構造(見[這裏]源(https://github.com/VahidN/EPPlus.Core/blob/master/src/EPPlus.Core/ExcelPackage.cs#L328)),你可能需要調用'保存()'方法 – Tseng

+0

或者只是首先在'MemoryStream'中執行'excel.SaveAs(HttpContext.Response.Body)'。爲什麼要浪費內存時,你可以直接寫入響應流......你只是必須明白你的問題以前的解決方案,並在未來的應用它們,而不是要求一個複製和粘貼代碼準備每一次 – Tseng

回答

1

您可以在控制器操作中返回FileStreamResult之一。

它返回與指定的contentType爲內容類型和指定fileDownloadName作爲建議的文件名指定的FILESTREAM文件。

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

編輯:

樣的行動方法 -

var data = new[]{ 
         new{ Name="Ram", Email="[email protected]", Phone="111-222-3333" }, 
         new{ Name="Shyam", Email="[email protected]", Phone="159-222-1596" }, 
         new{ Name="Mohan", Email="[email protected]", Phone="456-222-4569" }, 
         new{ Name="Sohan", Email="[email protected]", Phone="789-456-3333" }, 
         new{ Name="Karan", Email="[email protected]", Phone="111-222-1234" }, 
         new{ Name="Brij", Email="[email protected]", 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 screenshot-

enter image description here

+0

你的建議,它給出了錯誤:'不能訪問一個封閉的流'。這可能是因爲使用{...}語句,最後關閉了流。但是在我刪除'使用{...}'後,它下載了一個沒有數據的Excel文件。我用'return File(memoryStream,「application/vnd.openxmlformats-officedocument.spreadsheetml.sheet」,「Contact.xlsx」)替換了最後3行;' – nam

+0

試試這個 - 'new MemoryStream(excel.GetAsByteArray()) ;' – Sanket

+0

我使用了'var memoryStream = new MemoryStream(excel.GetAsByteArray());'然後得到錯誤在行'excel.SaveAs(memoryStream);':**無法訪問封閉的Stream **。 – nam

相關問題