使用LINQ读取Excel

NET*_*ion 16 linq excel

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

书籍数据

     Code     Name     IBN
Run Code Online (Sandbox Code Playgroud)

奥斯特

    UX         test1     34
   UZ         test2     345
   UN         test3     5654
Run Code Online (Sandbox Code Playgroud)

我们

   UX         name1     567
  TG         nam2      123
  UM         name3     234
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码阅读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")
      };
Run Code Online (Sandbox Code Playgroud)

上面的代码不好得到我使用"F2"的"代码"和我使用p [0]的国家.我应该用什么来获取每个国家的代码和名称.

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

总之,首先它必须将所有数据放在列表或字典中,然后您可以调用列表或字典按国家/地区获取数据过滤.谢谢

Pau*_*aul 32

你需要做两件事:

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

| 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  |
Run Code Online (Sandbox Code Playgroud)

其次,使用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"]
                };
Run Code Online (Sandbox Code Playgroud)

有关开源项目的更多信息,请查看Linq to Excel简介视频.

  • 神圣的废话,Linq到Excel FTW!值得一提的是将它作为一种资源发现. (5认同)

Goo*_*ber 6

建议1

检查这个链接......正如AKofC建议的那样,创建一个保存数据的类将成为您的第一个停靠点.我发布的链接有一个我们提出的想法的小例子.

建议2与示例...

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

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

新书信息类:

class MyBookInfo
{
    public string CountryName { get; set; }
    public string BookCode { get; set; }
    public string BookName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

检索信息的方法:

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")
                       };
        }
Run Code Online (Sandbox Code Playgroud)

  • 请使用p [0]!= null而不是p [0] .ToString()!= null因为如果p [0]为null,则无法调用ToString()方法并抛出异常 (2认同)

小智 3

据我了解,我建议创建一个 BookData 类,其中包含您需要的属性,在本例中为“国家/地区”、“代码”、“名称”和“IBN”。

然后,在用 Excel 内容填充数据集后,创建一个新列表,并循环访问数据集中的数据行,将 Excel 值添加到列表中。

然后您可以在列表上使用 Linq,如下所示:

 List<BookData> results = from books in bookList
                                       where books.country == 'US'
                                       select books;
Run Code Online (Sandbox Code Playgroud)

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