以下是基于APB框架做的动态导出Excel,思路是列名和数据分开进行组装,所以使用DataTable来实现。
//固定列名
var exporterHeaders = new List<ExporterHeaderInfo>
{
{ new ExporterHeaderInfo(){ Index=1,PropertyName="报名会员昵称",DisplayName="报名会员昵称",ExporterHeaderAttribute=new ExporterHeaderAttribute()} },
{ new ExporterHeaderInfo(){ Index=2,PropertyName="报名会员手机号",DisplayName="报名会员手机号",ExporterHeaderAttribute=new ExporterHeaderAttribute()} },
{ new ExporterHeaderInfo(){ Index=3,PropertyName="报名会员时间",DisplayName="报名会员时间",ExporterHeaderAttribute=new ExporterHeaderAttribute()} },
{ new ExporterHeaderInfo(){ Index=4,PropertyName="报名状态",DisplayName="报名状态",ExporterHeaderAttribute=new ExporterHeaderAttribute()} },
};
var headers = await _registrationActivitiesRepository.GetMongoQueryable().Where(x => x.Id == activityId).Select(x => x.CollectingInfos).FirstOrDefaultAsync();
foreach (var item in headers)
{
var exportHeader = new ExporterHeaderInfo { Index = exporterHeaders.Count + 1, PropertyName = item.Key, DisplayName = item.Key, ExporterHeaderAttribute = new ExporterHeaderAttribute() };
exporterHeaders.Add(exportHeader);
}
foreach (var item in exporterHeaders)
{
dataTable.Columns.Add(item.DisplayName);
}
foreach (var item in query)
{
var rows = new List<object>
{
item.RegistrationNickname,
item.RegistrationPhone,
item.RegistrationTime,
item.IsCancel==false?"报名成功":"报名取消"
};
foreach (var row in item.RegistrationInfos)
{
rows.Add(row.Value);
}
dataTable.Rows.Add(rows.ToArray());//上面是List<object>类型,所以要使用ToArray()
}
return await _exporter.Export<DataTable>($"报名记录-{activityId}-{DateTime.Now:yyyyMMddHHmmss}.xlsx", dataTable);