2016-11-09 121 views
1

我需要建立一個方法,將接收模式Excel文件,建立從它(建築和接收部分是沒有問題的完成)Excel,然後出口使用內存(讓用戶下載)流(不保存在服務器上)。我是新來ASP.NET和MVC,所以我發現引導和建造這是一個教程項目:C#Asp.NET MVC下載使用FileStreamResult

public FileResult Download() 
    { 
     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 

     Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
     Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 

     object misValue = System.Reflection.Missing.Value; 

     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     xlWorkSheet.Cells[1, 1] = "ID"; 
     xlWorkSheet.Cells[1, 2] = "Name"; 
     xlWorkSheet.Cells[2, 1] = "1"; 
     xlWorkSheet.Cells[2, 2] = "One"; 
     xlWorkSheet.Cells[3, 1] = "2"; 
     xlWorkSheet.Cells[3, 2] = "Two"; 


     var path = "C:\\Work-Work\\TestFolder\\XCLbuildTry1\\csharp-Excel.xls"; 
     xlWorkBook.SaveAs(path); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     Marshal.ReleaseComObject(xlWorkSheet); 
     Marshal.ReleaseComObject(xlWorkBook); 
     Marshal.ReleaseComObject(xlApp); 
     return File(path, "application/vnd.ms-excel", "WidgetData.xlsx"); 
    } 

現在我需要改變這個代碼,以使這種方法讓我的Excel文件,但不保存在服務器上我的Excel文件。我試圖谷歌一些指南和答案在這裏,堆棧,但現在我找不到解決方案,我可以實現。

我想我應該用FileStreamResult,但是所有的導遊提供有關創建和插入我的文件轉換成流沒有特別的信息。

回答

5

不幸的是,似乎Microsoft.Office.Interop.Excel.Workbook接口(msdn)將允許您將工作簿轉換爲內存流。

然而,在過去,我已經使用外部庫,EPPlus,已飛馳工作。

請參閱以下使用EPPlus代碼,不會要求您將文件保存在服務器上。


BusinessLogic

public MemoryStream Download() { 
    MemoryStream memStream; 

    using (var package = new ExcelPackage()) { 
     var worksheet = package.Workbook.Worksheets.Add("New Sheet"); 

     worksheet.Cells[1, 1].Value = "ID"; 
     worksheet.Cells[1, 2].Value = "Name"; 
     worksheet.Cells[2, 1].Value = "1"; 
     worksheet.Cells[2, 2].Value = "One"; 
     worksheet.Cells[3, 1].Value = "2"; 
     worksheet.Cells[3, 2].Value = "Two"; 

     memStream = new MemoryStream(package.GetAsByteArray()); 
    } 

    return memStream; 
}  

控制器

public FileStreamResult Download() { 
    var memStream = BusinessLogic.Download(); 
    result File(memStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
} 
+0

看起來它會正常工作,但是我的'worksheet'是 '只讀' 模式受阻。我已經嘗試了一些在堆棧上的解決方案: http://stackoverflow.com/questions/20751808/make-column-or-cells-readonly-with-epplus - >根本沒有結果,但沒有警告 http: //stackoverflow.com/questions/19999531/how-to-create-readonly-excel-sheet-using-c-sharp-net - >給出警告'不definition' http://stackoverflow.com/questions/18059979 /創建-AN-Excel的文件與-epplus,但是,它 - 是 - 總是隻讀 - >我不知道,瀏覽器如何讓VS給出我的代碼(最後答案)警告 – rainbowShiningUnicorn

+0

@rainbowShiningUnicorn是的工作表是隻讀還是整個工作簿只有在保存時纔讀取? – Chawin

+0

屬性'Cells'只有'get'方法。 – rainbowShiningUnicorn