EXcel最大支持导出的数据量是1048576条。
但要快速导出成功的话 以往的导出方法就不再适用了
这时候可以用到MiniExcel类库
cs
/// <summary>
/// 数据导出到Excel快速版
/// </summary>
/// <param name="dataReader"></param>
/// <param name="param"></param>
/// <returns></returns>
public virtual async Task DataToExcelFastAsync(object dataReader, string param)
{
var input = JsonConvert.DeserializeObject<ExcelExportParam>(param);
try
{
input.input.TaskStatus = (int)ExcelTaskStatusEnum.完成;
//miniExcel(导出文件更快更强, 但是文件会变大)
var config = new OpenXmlConfiguration()
{
TableStyles = TableStyles.None,
AutoFilter = false,
};
// avoid to load all data into memory
await MiniExcel.SaveAsAsync(input.input.FilePath, dataReader, configuration: config);
await _downLoadTaskAppService.DownLoadTaskCreateOrUpdate(input.input);
}
catch (Exception ex)
{
input.input.TaskStatus = (int)ExcelTaskStatusEnum.失败;
input.input.ErrorMsg = ex.Message;
await _downLoadTaskAppService.DownLoadTaskCreateOrUpdate(input.input);
}
}
这是我导出写的例子 导出百万条数据还是很快的 不过缺点是excel 只能显示最多104万条 超过的条数就不会再显示 想要全部显示 可能还需要进一步 分成多个表格、或改变导出格式等方式 这个后面再做研究。。。
cs
public async Task BarCodeBalanceExportBcpkAsync(ExcelExportArgs args)
{
DownLoadTaskListDto dto = args.dto;
//将DownLoadTask表中的请求参数反序列化为对象
var input = JsonConvert.DeserializeObject<ExportBarCodeBalanceListInput>(dto.Input);
input.input = ObjectMapper.Map<DownLoadTaskListDto, DownLoadTaskCreateOrUpdateInput>(dto);
input.Filter.StartTime = input.Filter.StartTime?.Date;
input.Filter.EndTime = input.Filter.EndTime?.Date.AddDays(1);
var sql = await _stkBarCodeBalancesDapperRepository.BarcodeBalanceListNewBcpkAsync(input.Filter);
var connectionString = _configuration.GetValue<string>("ConnectionStrings:Wms");
await using (var con = new SqlConnection(connectionString))
{
await con.OpenAsync();
await using (var transaction = await con.BeginTransactionAsync())
{
try
{
input.input.TaskStatus = (int)ExcelTaskStatusEnum.完成;
var reader = await con.ExecuteReaderAsync(sql, transaction: transaction);
var config = new OpenXmlConfiguration()
{
TableStyles = TableStyles.None,
AutoFilter = false,
};
// avoid to load all data into memory
await MiniExcel.SaveAsAsync(input.input.FilePath, reader, configuration: config);
await _downLoadTaskAppService.DownLoadTaskCreateOrUpdate(input.input);
await reader.CloseAsync();
await reader.DisposeAsync();
}
catch (Exception ex)
{
input.input.TaskStatus = (int)ExcelTaskStatusEnum.失败;
input.input.ErrorMsg = ex.Message;
await _downLoadTaskAppService.DownLoadTaskCreateOrUpdate(input.input);
}
//await _excelManagerAppService.DataToExcelFastAsync<ExportBarCodeBalanceListInput>(input, reader);
}
await con.CloseAsync();
}
}