запрос на чтение листа столбца excel с помощью OLEDB

Я совершенно новичок в OleDB и читаю файлы Excel. У меня есть рабочий лист с 3 столбцами (имя - фамилия - адрес электронной почты), и мне нужно:

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

Я использую объект OpenFileDialog (ofd) и TextBox (excel) для отображения выбранного файла. Это мой код:

if (ofd.ShowDialog() == DialogResult.OK)
{
    excel.Text = ofd.FileName;
    connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel.Text + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\"";
    conn.ConnectionString = connection;
    conn.Open();
    string name_query = "SELECT A FROM[" + ofd.SafeFileName + "]";
    OleDbDataAdapter da = new OleDbDataAdapter(name_query, conn);
    da.Fill(table);
    conn.Close();
    j = table.Rows.Count;
}

Не работает, проблема с запросом в "FROM...". Обычно я читаю такой запрос:

"SELECT * FROM [Sheet1$]"

но я не могу найти, что такое Sheet1$. Кто-нибудь может объяснить мне правильный запрос?

2) Чтобы получить доступ к каждому элементу таблицы (она будет содержать только третий столбец) и сохранить его в строковой переменной, что мне нужно сделать?

Большое спасибо!


person Frank Lioty    schedule 15.06.2012    source источник


Ответы (1)


Чтобы получить имена листов, вы можете использовать функцию getschema по умолчанию от поставщиков данных (connection.getschema). Без заголовков столбцов (HDR=NO) столбцы называются F1, F2 и т. д., поэтому для третьего поля вы можете запросить F3. Если вы хотите быть полностью уверенным, вы также можете использовать getschema для получения имен столбцов листа/таблицы, найденных с помощью первой getschema. Наконец, чтобы получить значения в списке строк, вы можете использовать немного Linq (см. список строк в примере). Не уверен, что вы имели в виду одно строковое значение, но если это так, вы можете использовать string.join для выбора linq.

Комбинированный код, начиная с формы открытия соединения:

conn.Open();
var tableschema = conn.GetSchema("Tables");
var firstsheet = tableschema.Rows[0]["TABLE_NAME"].ToString();
string name_query = "SELECT F3 FROM [" + firstsheet + "]";
OleDbDataAdapter da = new OleDbDataAdapter(name_query, conn);
da.Fill(table);
conn.Close();
j = table.Rows.Count;
var stringlist = table.Rows.Cast<DataRow>().Select(dr => dr[0].ToString()).ToList();
person Me.Name    schedule 15.06.2012
comment
Я его добавил, но он не работает (ошибка при da.Fill(table)). Что это за строка таблицы? А ТАБЛИЦА_ИМЯ? Первый лист? Таким образом, я ничего не могу понять. - person Frank Lioty; 15.06.2012
comment
При использовании OLEDB в Excel листы интерпретируются как таблицы. Таким образом, запрос таблиц для имен таблиц возвращает имена листов. tablechema.Rows[0] возвращает строку данных с информацией о первой таблице. [TABLE_NAME] вызывает индекс столбца в строке данных с именем table_name, которое содержит имя листа. - person Me.Name; 15.06.2012