[C#] .Net 下操作 Excel 新選擇 EPPlus - 簡單還原 WorkSheet 資料回 List

2024-02-15

上一篇文章寫到 如何使用 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<T> GetWorkSheetToList<T>(ExcelWorksheet sheet) { List<T> list = new List<T>(); //取得第一欄的資料 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<EpplusTableColumnAttribute>(); 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<Staff>(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




當麻許的碎念筆記 2014 | Donma Hsu Design.