在.net的环境中大数据量导出Excel,则需要考虑到内存占用的问题,这时候就不能使用传统的方法,即将所有数据读入内存在写入Excel,这样可能会导致内存溢出。
一种常见的解决方案是使用流式写入:
下面是一个使用开源库EPPlus进行流式写入的例子:
public ActionResult DownloadExcel()
{
var stream = new MemoryStream();
using (var package = new ExcelPackage(stream))
{
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
for (int i = 1; i <= 10000; i++)
{
for (int j = 1; j <= 20; j++)
{
worksheet.Cells[i, j].Value = $"Cell {i} {j}";
}
}
package.Save();
}
stream.Position = 0;
string excelName = $"UserList-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
// MIME type is defined by RFC 3778
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
}
这种方法的优点是在写入数据时只会占用很少的内存,因为数据被分批写入而不是一次性全部加载。而且,这种方法也支持将数据写入流,这样就可以直接将数据发送到客户端,而不需要在服务器上产生临时文件。

但是,使用流式写入的时候需要注意的是,由于数据是分批写入的,所以不能在写入过程中对已经写入的数据进行修改,否则会引起数据的混乱。
需要注意的是这里演示的是一个基本的示例,真正使用时可能需要做更多的优化,比如分页查询数据库然后再写入Excel,否则如果数据量过大,查询数据库的过程也会占用很多内存。同时也可以合理的调整每批写入的数据量,以达到最优的内存使用和性能。
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/169655.html