Чтение 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 испортил мне, так что да. > __ >