【问题标题】:.NET Core 2 download Excel file from memory stream.NET Core 2 从内存流下载 Excel 文件
【发布时间】:2018-03-31 10:26:20
【问题描述】:

我正在处理一个 .NET Core 项目,我应该从记录中创建一个电子表格文件并下载它而不将其保存在服务器中。搜索上述标题并没有太大帮助,但提供了一些指导。此外,ASP.NET 中使用的大多数方法在 .NET Core 中都不起作用。所以,我终于可以想出一个很好的解决方案。我将在下面的答案中为那些像我一样进行相同搜索的人分享它。

【问题讨论】:

    标签: c# excel asp.net-core asp.net-core-mvc memorystream


    【解决方案1】:

    首先,您需要安装EPPlus.Core 软件包。如果您将通过Package Manager Console 安装它,您可以这样做:

    安装包 EPPlus.Core

    然后添加 OfficeOpenXml 的 using 语句:

    使用 OfficeOpenXml;

    然后下载文件的示例方法如下所示:

    using OfficeOpenXml;
    
    namespace MyProject.Controllers
    {
        public class SubscribersController : Controller
        {
            private readonly ApplicationDbContext _context;
    
            public SubscribersController(ApplicationDbContext context)
            {
                _context = context;
            }
    
            public async Task<IActionResult> ExportToExcel()
            {
                var stream = new System.IO.MemoryStream();
                using (ExcelPackage package = new ExcelPackage(stream))
                {
                    var subscribers = await _context.Subscribers.ToListAsync();                        
    
                    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Subscribers");
    
                    worksheet.Cells[1, 1].Value = "Name";
                    worksheet.Cells[1, 2].Value = "Email";
                    worksheet.Cells[1, 3].Value = "Date Subscribed";
                    worksheet.Row(1).Style.Font.Bold = true;
    
                    for (int c = 2; c < subscribers.Count + 2; c++)
                    {
                        worksheet.Cells[c, 1].Value = subscribers[c - 2].Name;
                        worksheet.Cells[c, 2].Value = subscribers[c - 2].Email;
                        worksheet.Cells[c, 3].Value = subscribers[c - 2].DateCreated.ToString();
                    }
    
                    package.Save();
                }
    
                string fileName = "Subscribers.xlsx";
                string fileType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                stream.Position = 0;
                return File(stream, fileType, fileName);
            }
        }
    }
    

    【讨论】:

    • File() 有一个重载,它讲述了一个流,应该可以将它寻找到 0 然后使用它。
    • @Mardoxx 谢谢,这也有效。我添加了更改
    • @Elnoor - 您不会在 stream.Position = 0; 行收到错误,因为该包将与流一起在该点被释放吗?
    • @RoastBeast 不。包将被释放,但不会流式传输
    • 这不会正确处理内存流。最好对内存流使用 using 子句,在其中调用 memStream.ToArray(),它将结果存储在一个字节数组中,该数组在 using 子句范围之外声明。您可以使用字节数组轻松返回 File 结果。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2014-07-11
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多