使用LINQ读取Excel

我想阅读excel 2003(不能更改为来自第三方)和列表或词典中的组数据( 我不是哪一个是好的 )例如下面的(Excel格式)图书数据[excel中的第一行和第一列]第二行(无logging)代码,名称,IBN [第三行(第二列,第三列)Aust [第四行,第一列] UX test1 34 [第五行(第二列,第三列)……。 …

书籍数据

Code Name IBN 

奥斯特

  UX test1 34 UZ test2 345 UN test3 5654 

我们

  UX name1 567 TG nam2 123 UM name3 234 

我正在阅读使用以下代码的Excel数据(来自Google的一些帮助)

  string filename = @"C:\\" + "Book1.xls"; string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=Excel 8.0;"; OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString); DataSet myDataSet = new DataSet(); dataAdapter.Fill(myDataSet, "BookInfo"); DataTable dataTable = myDataSet.Tables["BookInfo"]; var rows = from p in dataTable.AsEnumerable() where p[0].ToString() != null || p[0].ToString() != "" && p.Field<string>("F2") != null select new { countryName= p[0], bookCode= p.Field<string>("F2"), bookName= p.Field<string>("F3") }; 

上面的代码是不好的,因为我得到的“代码”我使用“F2”和国家我使用p [0]。我应该用什么来获得每个国家的代码和名称。

另外它提供了我想要的信息,但是我不知道如何放在列表或字典中,或者在类中,所以我可以通过传递参数作为国家名称来获取数据。

总之首先必须把所有的数据都放在列表或字典中,然后你可以调用列表或字典获取数据按国家过滤。 谢谢

有两件事你需要做:

首先,您需要重新设置电子表格的格式,使第一行的列标题如下表所示

 | Country | Code | Name | IBN | |---------|------|---------|------| | Aust | UX | test1 | 34 | | Aust | UZ | test2 | 345 | | Aust | UN | test3 | 5654 | | US | UX | name1 | 567 | | US | TG | name2 | 123 | | US | UM | name3 | 234 | 

其次,使用Linq to Excel库来检索数据。 它负责build立oledb连接并为你创buildsql。 下面是一个例子,说明如何使用这个库

 var book = new ExcelQueryFactory("pathToExcelFile"); var australia = from x in book.Worksheet() where x["Country"] == "Aust" select new { Country = x["Country"], BookCode = x["Code"], BookName = x["Name"] }; 

查看Linq to Excel介绍video ,了解更多关于开源项目的信息。

build议1

检出这个链接……正如AKofC所build议的那样,创build一个类来保存你的数据将是你的第一个通话端口。 我发布的链接有一个我们提出的想法的小例子。

build议2与例子…

你已经发布的代码显而易见的做法是创build一个新的类来存储你的图书信息。

然后,您只需定义您想要传递到您的bookinformation类的新实例的Excel文档中的哪些字段。

新书信息分类:

 class MyBookInfo { public string CountryName { get; set; } public string BookCode { get; set; } public string BookName { get; set; } } 

方法检索信息:

 public void GetMyBookInfoFromExcelDocument() { string filename = @"C:\\" + "Book1.xls"; string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=Excel 8.0;"; OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString); DataSet myDataSet = new DataSet(); dataAdapter.Fill(myDataSet, "BookInfo"); DataTable dataTable = myDataSet.Tables["BookInfo"]; var rows = from p in dataTable.AsEnumerable() where p[0].ToString() != null || p[0].ToString() != "" && p.Field<string>("F2") != null select new MyBookInfo { CountryName = p.Field<string>("InsertFieldNameHere"), BookCode = p.Field<string>("InsertFieldNameHere"), BookName = p.Field<string>("InsertFieldNameHere") }; } 

从我的理解,我build议创build一个BookData类包含您需要的属性,在这种情况下,国家,代码,名称和IBN。

然后,一旦你用Excel的东西填充你的DataSet,创build一个新的列表,并通过在DataSet中的DataRows循环,将Excel值添加到列表。

那么你可以在列表上使用Linq:

  List<BookData> results = from books in bookList where books.country == 'US' select books; 

或类似的东西。 我没有Visual Studio,而Intellisense已经宠坏了我,所以是的。 > __>