LINQ to Excel:關聯式資料存取

LINQ to Excel |關聯式資料存取透過瀏覽器檢視會計損益表 

除了單一工作表的存取,透過關聯式LINQ語法,我們便能直接存取跨工作表的資料內容,這一篇利用一個範例進行相關的示範說明。

為了示範這個範例,預先準備以下的Excel檔案,其中包含兩個工作表,分別是 Products 與Categories,內容如下:


由於 Products工作表的CategoryID欄位對應至Categories工作表欄位,因此這裏要將其關聯起來,以取出每一個產品的分類名稱,結果如下:


新增一個主控台應用程式專案,於其中建立對應的類別檔案,分別命名為TProducts.cs與TCategories.cs,TProducts.cs請參考這一篇的說明,以下列舉TCategories.cs的內容:

class TCategories
{
public string CategoryID { set; get; }
public string CategoryName { set; get; } 
}

其中的屬性分別對應至Categories工作表的同名欄位內容。接下來開啟主控台檔案,Program.cs,參考前一個小節的範例,完成Excel工作表與類別結構的配置,程式如下:

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");
exFile.AddMapping<TCategories>(tc => tc.CategoryID, "CategoryID");
exFile.AddMapping<TCategories>(tc => tc.CategoryName, "CategoryName");

緊接著萃取Excel檔案中工作表Products與Categries的資料,並且回傳IEnumerable介面物件,程式列舉如下:

IEnumerable<TProducts> products =
from p in exFile.Worksheet<TProducts>("Products")
select p;
IEnumerable<TCategories> categories =
from c in exFile.Worksheet<TCategories>("Categories")
select c;

接下來針對 products 與 categories 兩個物件,進行 join 關聯,語法如下:

var products_cat = from p in products
join c in categories
on p.CategoryID equals c.CategoryID
select new
{
pname = p.ProductName,
pid = p.ProductID,
pcat = c.CategoryName
};

其中的join關聯了products與categories兩個物件的資料內容,最後透過select將其中的ProductName、ProductID以及代表分類名稱的CategoryName資料取出,最後利用迴圈將其中的資料取出。

foreach (var column in products_cat)
{
Console.WriteLine(column.pcat + ":\n\t" + column.pid + "/" + column.pname);
}

迴圈的結果如上所述。

LINQ to Excel |關聯式資料存取透過瀏覽器檢視會計損益表 




沒有留言: