C# Asp.NET MVC загрузка файла Excel с помощью FileStreamResult

Мне нужно создать метод, который будет получать модель, создавать из нее Excel (сборка и получение части выполняются без проблем), а затем экспортировать (разрешить пользователю загружать ее), используя поток памяти (без сохранения на сервере). Я новичок в ASP.NET и MVC, поэтому я нашел руководство и создал его как учебный проект:

    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, но во всех руководствах нет конкретной информации о создании и вставке моего файла в поток.

1 ответ

Решение

К сожалению, не похоже, что 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"); 
}
Другие вопросы по тегам