从内存流下载Excel文件的.NET Core 2下载

6

我正在开发一个.NET Core项目,需要从记录中创建电子表格文件并下载它,而不将其保存在服务器上。搜索上述标题并没有帮助太多,但给出了一些方向。此外,大多数在ASP.NET中使用的方法在.NET Core中无法使用。因此,我最终想出了一个可行的解决方案。我将在下面的答案中分享给那些像我一样进行相同搜索的人。

1个回答

8
首先,您需要安装EPPlus.Core包。如果您将通过Package Manager Console进行安装,则可以执行以下操作:

Install-Package 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);
        }
    }
}

3
File()有一个接受流的重载函数,将其定位到0然后使用该函数应该没问题。 - Mardoxx
@Mardoxx 谢谢,那也可以。我已经添加了更改。 - Elnoor
1
@Elnoor - 在 stream.Position = 0; 这一行,你不会因为包已经被处理掉而出现错误吗?流也是如此。 - RoastBeast
@RoastBeast 不会。包将被处理但不会流. - Elnoor
这并没有正确释放内存流。更好的方法是使用using子句来管理内存流,在其中调用memStream.ToArray(),将结果存储在声明在using子句范围之外的字节数组中。你可以很容易地使用字节数组返回一个文件结果。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接