简体   繁体   English

C#Asp.NET MVC使用FileStreamResult下载Excel文件

[英]c# Asp.NET MVC downloading excel file using FileStreamResult

I need to build a method, that will receive model, build excel from it (building and receiving part is done without problems) and then export (let user download it) using memory stream (without saving it on the server). 我需要构建一个方法,该方法将接收模型,从中构建excel(构建和接收部分都没有问题),然后使用内存流(无需将其保存在服务器上)导出(让用户下载它)。 I am new to ASP.NET and MVC so i found guide and built this as a tutorial project: 我是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");
    }

Now i need to change this code to make this method sent my excel file without saving my excel file on server. 现在,我需要更改此代码,以使此方法发送我的excel文件而不将excel文件保存在服务器上。 I have tried to google some guides and answers here, on stack, but for now i cant find a solution, which i can implement. 我曾尝试在此处将Google的一些指南和答案放在堆栈上,但是现在我找不到可以实现的解决方案。

I think i should use FileStreamResult , but all guides give no particular information about creating and inserting my file into stream. 我认为我应该使用FileStreamResult ,但是所有指南都没有提供有关创建和将我的文件插入流中的特定信息。

Unfortunately it does not appear that the Microsoft.Office.Interop.Excel.Workbook interface ( msdn ) will allow you to convert your workbook to a memory stream. 不幸的是,似乎没有Microsoft.Office.Interop.Excel.Workbook接口( msdn )允许您将工作簿转换为内存流。

However, in the past I have used an external library, EPPlus , which has worked fantastically. 但是,过去我使用了外部库EPPlus ,该库运行非常好。

See below for code using EPPlus which will not require you to save the file on the server. 有关使用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;
}    

Controller 控制者

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM