使用LINQ读取Excel

时间:2009-09-28 08:17:03

标签: linq excel

我想阅读excel 2003(不能改变它来自第三方)和列表或词典中的组数据(我不是哪一个好) 例如下面(Excel格式) 书籍数据[excel中的第一行和第一列] 第二行(没有记录) 代码,名称,IBN [第三行(第二列,第三列) Aust [第四行,第一列]  UX test1 34 [第五行(第二栏,第三栏) ...... ....

图书数据

     Code     Name     IBN

奥斯特

    UX         test1     34
   UZ         test2     345
   UN         test3     5654

US

   UX         name1     567
  TG         nam2      123
  UM         name3     234

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

        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]的国家/地区。我应该使用什么来获取每个国家/地区的代码和名称。

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

简而言之,首先它必须将所有数据放入列表或字典中,然后您可以按国家/地区调用列表或字典获取数据。 感谢

3 个答案:

答案 0 :(得分:30)

您需要做两件事:

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

| 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库来检索数据。它负责制作oledb连接并为您创建sql。下面是一个使用库

的简单示例
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 intro video以获取有关开源项目的更多信息。

答案 1 :(得分:6)

建议1

结帐THIS链接......正如AKofC建议的那样,创建一个保存数据的类将是您的第一个停靠点。我发布的链接有一个我们提出的想法的小例子。

建议2与示例......

您发布的代码显而易见的事情是创建一个新的类来存储您的图书信息。

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

新书信息类:

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")
                       };
        }

答案 2 :(得分:3)

根据我的理解,我建议创建一个包含所需属性的BookData类,在本例中为Country,Code,Name和IBN。

然后,当您使用Excel填充DataSet时,创建一个新List,并循环DataSet中的DataRows,将Excel值添加到List中。

然后你就可以在列表上使用Linq:

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

或类似的东西。我没有Visual Studio,Intellisense已经破坏了我,所以是的。 &GT; __&GT;