Чтение Excel с помощью LINQ

Я хочу прочитать excel 2003 (не могу измениться по мере поступления от третьей стороны) и данные группы в списке или словаре (Я не знаю, какой из них хорош) например, ниже (форматирование Excel) Данные книг [первая строка и первый столбец в excel] вторая строка (без записей) Код, имя, IBN [третья строка (вторая колонка, третий столбец) Aust [четвертая строка, первая колонка]  UX test1 34 [пятая строка (вторая колонка, третий столбец) ...... ....

Данные о книгах

     Code     Name     IBN

Aust

    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]. Что я должен использовать, чтобы получить код и имя для каждой страны.

Кроме того, он предоставляет информацию, которую я хочу, но я не могу добавить в список или словарь или класс, чтобы я мог получать данные, передавая параметр как имя страны.

Короче сначала он должен поместить все данные в список или словарь, а затем вы можете вызвать список или словарь получить данные по стране. Благодаря

Ответы

Ответ 1

Вам нужно сделать две вещи:

Сначала вам нужно переформатировать таблицу, чтобы заголовки столбцов в первой строке, как в приведенной ниже таблице, отображали

| 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 для получения дополнительной информации о проекте с открытым исходным кодом.

Ответ 2

Предложение 1

Оформить заказ ЭТО ссылка...... как предлагает 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")
                       };
        }

Ответ 3

Из того, что я понимаю, я предлагаю создать класс BookData, содержащий необходимые вам свойства, в данном случае Country, Code, Name и IBN.

Затем, как только вы заполнили свой DataSet материалами Excel, создайте новый List и пропустите DataRows в DataSet, добавив значения Excel в список.

Затем вы можете использовать Linq в списке так:

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

Или что-то в этом роде. У меня нет Visual Studio, и Intellisense испортил мне, так что да. > __ >