上一篇文章寫到 如何使用 EPPlus 建立 Excel 檔案,也有讀取 Excel 的方法
但是總覺得寫起來不夠舒服,難道就不能夠直接透過 第一 Row 透過欄位的方式還原物件嗎?
這邊案例很簡單,上一篇文章 產出的 Excel 長這樣

我要將這資料表的物件讀回成 List<Staff>
Staff.cs :
public class Staff
{
[EpplusTableColumn(Order = 1, Header = "員工編號")]
[Required]
public string Id { get; set; }
[Column(1)]
[EpplusTableColumn(Order = 2, Header = "姓名")]
public string Name { get; set; }
[EpplusTableColumn(Order = 3, Header = "到值日")]
public DateTime Create { get; set; }
[EpplusTableColumn(Order = 4, Header = "電話")]
public string Mobile { get; set; }
[EpplusTableColumn(Order = 5, Header = "薪水")]
public decimal Salary { get; set; }
public string Memo { get; set; }
}
這時候我要如何把這資料轉過去,因為 EPPlus 本身就有一個 Attribute 叫做 EpplusTableColumn ,我就想說裡面就有 Header 可以用
不需要開其他 Attribute 來做到,這邊我就寫一隻自動透過 Header 來對應的 function 方便我之後 複製貼上
private static List GetWorkSheetToList(ExcelWorksheet sheet)
{
List list = new List();
//取得第一欄的資料
var columnInfo = Enumerable.Range(1, sheet.Dimension.Columns).ToList().Select(n =>
new { Index = n, ColumnName = sheet.Cells[1, n].Value.ToString() }
);
//從第二欄位開始
for (int row = 2; row < sheet.Dimension.Rows; row++)
{
T obj = (T)Activator.CreateInstance(typeof(T));//generic object
foreach (var prop in typeof(T).GetProperties())
{
//取得 EpplusTableColumnAttribute 並且判斷一樣加入該 Property
var properName = prop.GetCustomAttribute();
if (properName != null)
{
int col = columnInfo.SingleOrDefault(c => c.ColumnName == properName.Header).Index;
var val = sheet.Cells[row, col].Value;
var propType = prop.PropertyType;
prop.SetValue(obj, Convert.ChangeType(val, propType));
}
else
{
continue;
}
}
list.Add(obj);
}
return list;
}
使用方法:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
var excelPackage = new ExcelPackage(AppDomain.CurrentDomain.BaseDirectory + "sample1.xlsx");
var worksheet = excelPackage.Workbook.Worksheets[0];
var result = GetWorkSheetToList(worksheet);
Console.WriteLine(JsonConvert.SerializeObject(result));
結果:

之後,這樣就不用一個一個比對,舒服~~
下面有一些前輩的案例,我都有參考而寫成,如果有不符合您的,可以參考下面連結
reference:
https://stackoverflow.com/questions/33436525/how-to-parse-excel-rows-back-to-types-using-epplus
https://gautammokal.medium.com/how-to-import-excel-data-to-a-list-of-objects-in-c-using-epplus-nuget-package-1193e7f277fe