背景:现在市面上数据量大的导出,大部分都是点击生产。然后有个异步程序,去查询、拼装数据。生产excel保存到服务器上。然后在提供一个下载地址。一旦遇到10W+行的数据,导出就会很慢,甚至有的等待时间很长。
本文介绍的是一种流式下载的方式,一边查数据,一边下载。
核心代码 :
1、 yield return 解释:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield
2、 var ft = HttpContext.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpBodyControlFeature>();
if (ft != null) ft.AllowSynchronousIO = true; 允许同步IO
源码地址:hhttps://github.com/BigMaJx/OOPDemo/blob/master/Api/Controllers/WeatherForecastController.cs
参考:NewLife.Cube Git:https://gitee.com/NewLifeX/NewLife.Cube/blob/master/NewLife.Cube/Common/ReadOnlyEntityController.cs
废话不多说,直接贴码。
- 接口导出ExportCsv 注意 ft.AllowSynchronousIO = true;
- 获取数据GetData,注意Class DisplayName为列头 注意yield return;GetList 可以大家可自己替换成从数据库查出的数据。一定分页查询。
- 导出方法:OnExportExcel。反射获取列头,每行写入流 csv.WriteLine(result);
结果:
上视频:
.net 导出csv 百万数据3s弹出下载框