2016-11-09 2 views
1

Мне нужно создать метод, который получит модель, построит excel из него (создание и получение части выполняется без проблем), а затем экспорт (пусть пользователь загружает его) с использованием памяти (без сохранения на сервере). Я новичок в ASP.NET и MVC, поэтому я нашел руководство и построил это как проект учебника:C# Asp.NET MVC загрузка файла excel с использованием 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"); 
    } 

Теперь мне нужно изменить этот код, чтобы сделать этот метод послал мой файл первенствовать без сохранения моего файла первенствовать на сервере , Я попробовал google некоторые руководства и ответы здесь, в стеке, но пока я не могу найти решение, которое я могу реализовать.

Я думаю, что я должен использовать 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 -> Предоставляет предупреждение 'Нет определения' http://stackoverflow.com/questions/18059979/create-a-excel-file-with-epplus-but-it-is-always-read-only -> Я понятия не имею, как браузер может заставить VS давать предупреждения по моему коду (последний ответ) – rainbowShiningUnicorn

+0

@rainbowShiningUnicorn листы только для чтения или все книги прочитаны только при сохранении? – Chawin

+0

Свойство 'Cells' имеет только метод' get'. – rainbowShiningUnicorn