LINQ to Excel:建立對應工作表的實體類別

直接利用LINQ存取Excel檔案的內容相當方便,但我們更希望將其當作一般的簡易資料庫使用,因此接下來要建立自訂的實體類別以對應工作表,為後續進一步的存取操作進行準備。預先準備測試用的 Excel 資料表如下:


建立一個新的主控台應用程式專案,將其命名為 Excel-Class ,於其中新增一個類別檔 TProducts.cs ,內容如下:

class TProducts
{
    public string ProductID { set; get; }
    public string ProductName { set; get; }
    public string CategoryID { set; get; } 
}

其中的三個屬性對應Excel工作表中的三個欄位。現在開啟主程式Program.cs,於其中建立實體類別的程式碼。

static void Main(string[] args)
{
var exFile =
new LinqToExcel.ExcelQueryFactory("productsList_join.xlsx");

       exFile.AddMapping<TProducts>(tp => tp.ProductID, "ProductID");
       exFile.AddMapping<TProducts>(tp => tp.ProductName, "ProductName");
       exFile.AddMapping<TProducts>(tp => tp.CategoryID, "CategoryID");
     
IEnumerable<TProducts> products =
        from p in exFile.Worksheet<TProducts>("Products")
        select p;

        foreach(TProducts product in products)
        {
            Console.WriteLine(
               product.CategoryID + "" +
               product.ProductID + "/" + product.ProductName);
        }
        Console.ReadLine();
}

其中以網底標示的部份,將所參考的 Execl 檔案工作表中的欄位透過調用 AddMapping()  方法,指定 TProducts 型別,逐一對應至自訂的類別屬性,然後透過 LINQ 將其工作表取出轉換成為 TProducts 型別IEnumerable物件。接下來就能夠透過強型別的方式進行內容存取。這個範例的結果如下:

1010081000001/USB 3.0 機殼
1010081000003/USB 3.0 U3系列蜂魔機殼
1010091000006/謎情系列 2237X機殼

上述資料的萃取過程中,已直接完成TProducts類別的對應,因此在LINQ敘述當中即可直接透過屬性取所需的欄位,例如以下的敘述:

var products =
from p in exFile.Worksheet<TProducts>("Products")
select new {p.ProductID,p.ProductName } ;

由於是 select 提取的資料已經不是 TProducts 類別了,因此以 var 型別儲存回傳的資料,迴圈修改如下:

foreach (var product in products)
{
Console.WriteLine(product.ProductID + "/" + product.ProductName);
}

原來的 TProducts 型別這次改成 var ,並逐一取出其中的 ProductID ProductName 屬性資料,得到以下的結果:


1000001/USB 3.0 機殼
1000003/USB 3.0 U3系列蜂魔機殼
1000006/謎情系列 2237X機殼

透過對應實體類別,我們可以將 Excel 檔案的內容轉換成為標準的實體類別結構,就如同關聯式資料庫的資料存取,接下來就可以進行跨工作表的關聯式存取操作了。


沒有留言: