[C#.NET][LINQ] 使用 LinqToExcel 查詢 Excel 檔案
這裡我使用 LNQPad4 操作,從 Nuget 上安裝,並加入 LinqToExcel、Remotion 兩個命名空間
調用的方式很簡單,如下圖所示
可以看到它回傳的是 LinqToExcel.Row 型別,裡面裝載的是Dictionary<string,string>,這屬於弱型別的一種
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
上圖的 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; }
}
運行結果如下:
另外一種呢,就是調用 excel.AddMapping,結果仍然與上述方法相同
有了強型別集合物件,便可輕鬆使用 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