Нет необходимости писать так много if ... else if ... else if ... else if ...
, чтобы получить соответствующие имена полей.
Более хороший способ -
- Использовать список полей (
IList<string>
) в качестве параметра.
- И затем сгенерируйте обязательный список полей с помощью
intersect
.
- Наконец, мы могли бы использовать отражение для извлечения всех связанных значений.
Осуществление
public IActionResult DownloadExcel(IList<string> fields)
{
// get the required field list
var userType = typeof(UserTable);
fields = userType.GetProperties().Select(p => p.Name).Intersect(fields).ToList();
if(fields.Count == 0){ return BadRequest(); }
using (ExcelPackage package = new ExcelPackage())
{
IList<UserTable> userList = _context.UserTable.ToList();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DbTableName");
// generate header line
for(var i= 0; i< fields.Count; i++ ){
var fieldName = fields[i];
var pi= userType.GetProperty(fieldName);
var displayName = pi.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName;
worksheet.Cells[1,i+1].Value = string.IsNullOrEmpty(displayName ) ? fieldName : displayName ;
}
// generate row lines
int totalUserRows = userList.Count();
for(var r=0; r< userList.Count(); r++){
var row = userList[r];
for(var c=0 ; c< fields.Count;c++){
var fieldName = fields[c];
var pi = userType.GetProperty(fieldName);
// because the first row is header
worksheet.Cells[r+2, c+1].Value = pi.GetValue(row);
}
}
var stream = new MemoryStream(package.GetAsByteArray());
return new FileStreamResult(stream,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
Вы можете настроить отображаемое имя, используя DsiplayNameAttribute
:
public class UserTable
{
public int Id{get;set;}
[DisplayName("First Name")]
public string fName { get; set; }
[DisplayName("Last Name")]
public string lName { get; set; }
[DisplayName("Gender")]
public string gender { get; set; }
}
Можно добавить любые свойства по своему усмотрению без жесткого кодирования в методе DownloadExcel
.
Демо :
Передача списка полей fields[0]=fName&fields[1]=lName&fields[2]=Non-Exist
создаст Excel, как показано ниже:
![enter image description here](https://i.stack.imgur.com/FrU7N.png)
[Update]
Чтобы экспортировать все поля, мы можем предположить, что клиент не передаст параметр fields
. Это означает, что когда поля null
или fields.Count==0
, мы экспортируем все поля:
[HttpGet("download")]
public IActionResult DownloadExcel(IList<string> fields)
{
// get the required field list
var userType = typeof(UserTable);
var pis= userType.GetProperties().Select(p => p.Name);
if(fields?.Count >0){
fields = pis.Intersect(fields).ToList();
} else{
fields = pis.ToList();
}
using (ExcelPackage package = new ExcelPackage()){
....
}
}