[C#.NET][LINQ] 使用 LinqToExcel 查詢 Excel 檔案

[C#.NET][LINQ] 使用 LinqToExcel 查詢 Excel 檔案

這裡我使用 LNQPad4 操作,從 Nuget 上安裝,並加入 LinqToExcel、Remotion 兩個命名空間

image

 

調用的方式很簡單,如下圖所示

image

 

可以看到它回傳的是 LinqToExcel.Row 型別,裡面裝載的是Dictionary<string,string>,這屬於弱型別的一種

image

 

 

LinqToExcel 提供了轉強型別的功能

 

先手動定義類別
public class FactProductInventory
{
    public string Id { get; set; }
    public string DateKey { get; set; }
    public string MovementDate { get; set; }
    public string UnitCost { get; set; }
    public string UnitsIn { get; set; }
    public string UnitsOut { get; set; }
    public string UnitsBalance { get; set; }
}

 

調用 excel.Worksheet<FactProductInventory> 把 Dictionary<string,string>  轉成 UserQuery.FactProductInventory

image

 

上圖的 Id 是 null,LinqToExcel 預設會去抓 Excel 檔案裡的 Title 跟 Property Name 是否吻合,然後對應它們,null 表示找不到對應,有兩種解法

加入 LinqToExcel.Attributes 命名空間,然後在Property Name上宣告 ExcelColumnAttribute

public class FactProductInventory
{
    [ExcelColumn("ProductKey")]
    public string Id { get; set; }
    public string DateKey { get; set; }
    public string MovementDate { get; set; }
    public string UnitCost { get; set; }
    public string UnitsIn { get; set; }
    public string UnitsOut { get; set; }
    public string UnitsBalance { get; set; }
}

 

運行結果如下:

image

 

另外一種呢,就是調用 excel.AddMapping,結果仍然與上述方法相同

image

 

 

有了強型別集合物件,便可輕鬆使用 Linq

void Main()
{
    ExcelQueryFactory excel = new ExcelQueryFactory(@"D:\FactProductInventory.xlsx");
    var worksheet=excel.Worksheet<FactProductInventory>("Part 1");
    excel.AddMapping<FactProductInventory>(p=>p.Id,"ProductKey");
      worksheet.Where (w => w.Id>=1 && w.Id<10).Where (w => w.MovementDate> new DateTime(2005,07,01)).Dump();
}

 

使用了強型別後,接下來的處理就是強型別,享有 VS 的 IntelliSence,敲錯欄位立馬知道;當然你也可以使用弱型別來進行查詢,不過個人並不建議使用較鬆散的弱型別來進行開發

更多的功能請參閱官網:https://github.com/paulyoder/LinqToExcel


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2015/05/15/151305.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo