1、使用LinqToExcel
LinqToExcel是一個.net framework平台下開源項目,它主要實現了LINQ的語法查詢Excel電子表格。類型之前的LINQToXXX如果你是LINQ語法糖愛好者那最適合您。
或從控制台使用以下命令:
PM> Install-Package LinqToExcel
在使用之前需要添加命名空間 using LinqToExcel;
//取得數據,只需要一行代碼 var execelfile = new ExcelQueryFactory(excelfilename.xls);
如何取到相應的表呢?
//緊接樓上 var tsheet = excelfile.Worksheet(0);
此時得到是沒有進行相應映射的(row)行列集合.
一個簡單的查詢:
var excelfile = new ExcelQueryFactory("1.xls"); var tsheet = excelfile.Worksheet(0);<br> //查詢30歲以上的人的名字 var query = from p in tsheet where p["Age"].Cast<int>() > 30 select p; foreach (var item in query) { Console.WriteLine("Name is {0}",item[0].Value.ToString()); } Console.Read();
查詢結果:
那如何轉成相應的實體集合呢?
class Program { static void Main(string[] args) { var excelfile = new ExcelQueryFactory("1.xls"); //用另一種方法取得實體數據集 var tsheet = excelfile.Worksheet<Person>(0); var query = from p in tsheet where p.Age > 30 select p; foreach (var item in query) { Console.WriteLine("Name is {0}", item.Name); } Console.Read(); } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public Person() { } public Person(string _name, int _age, string _address) { this.Name = _name; this.Age = _age; this.Address = _address; } }
結果:
這里需要注意的一點:
表頭名字如果是英文,(區分大小寫)必須與屬性名保持一致,要不然會報錯的----支持中文屬性名和表頭
如果將得到的數據集綁定到控件的時候,請最后轉List集合:
Winform示例:
后台代碼:
前台效果:
總結:感覺這個庫文件用起來簡單,實用,操作方便,而且結合了Linq的查詢特性,excel版本不僅支持03,而且連wps表格都支持(后綴名為.et),csv文件更不在話下了。
2、使用EPPlus
提到通過純.Net讀寫Excel,一般首先想到的自然是大名鼎鼎的NPOI,就連微軟官方的MSDN都有專門的一篇文章來介紹它的用法。今天在一個項目中使用到了導出報表為Excel的功能,便特地的試用了一下,感覺雖然它的功能夠強大,但談不上好用。可能是由於其起源與Java的POI的緣故,大部分的API還透濃濃着Java的味道。 例如,要在一個單元格中寫入數據時,必須先CreateRow(),再CreateCell()才能寫入,不能使用類似Cells[rowIndex, colIndex]=value之類的語句一步到位。
於是,便在網上繼續搜了一下,在文章《讀取 Excel 你還在用 NPOI 嗎?快來試試 LinqToExcel》中找到了另一個庫:LinqToExcel。這個庫可以通過一個LINQ查詢快速而友好的讀取Excel。不過,它貌似僅限於簡單的映射關系,並且不能寫入,大部分情況下不能滿足復雜一點的業務需求。
最后,我找到了一個非常強大的庫——EPPlus,感覺上基本上該有的功能都有了,並且有比較友好的API。如下是一個簡單的例子:
using (var p = new ExcelPackage()) { var sheet = p.Workbook.Worksheets.Add("My Sheet"); //Cells的起始索引是1 sheet.Cells[1, 1].Value = 0; sheet.Cells[2, 1].Value = 1; sheet.Cells[3, 1].Value = 2; sheet.Cells[4, 1].Value = 3; p.SaveAs(new FileInfo(@"r:\output.xlsx")); }
感覺上比NPOI友好多了。 效果如下:
這個例子比較簡單,更復雜一點的例子可以參考這個文章:http://zeeshanumardotnet.blogspot.com/2010/08/creating-advanced-excel-2007-reports-on.html(需要FQ)。或者它的官方幫助文檔:http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation
最后,提一下這個庫的一點不足——它只支持XLSX格式,不支持Office2003的Excel格式,不過到現在這個也不是什么問題了。