Причудливый выберите из файла Excel через метод oledbdataAdapter (C#)
-
29-09-2019 - |
Вопрос
У меня есть файл Excel в этой форме:
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
То есть весь столбец 3 пуст, за исключением последней строки. Я получаю доступ к файлу Excel через oledbdataAdapter, возвращая DataTable: вот код.
query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
Дело в том, что в этом сценарии мой код возвращает DataTable только с столбцом 1 и столбца 2.
Я предполагаю, что реактивный двигатель пытается вывести тип столбца по типу самой первой ячейки в каждом столбце; Будучи первым значением нулевым, весь столбец игнорируется.
Я пытался заполнить нули, и этот код фактически возвращает все три столбца; Это, очевидно, наименее предпочтительное решение, потому что я должен обрабатывать большое количество небольших файлов.
Инвертирование диапазона выбора (от, то есть «A1: C5» в «C5: A1») также не работает. Я ищу что -то более элегантное.
Я уже нашел несколько постов, обсуждающих несоответствие типа (ячейки Varchar в столбцах INT и наоборот), но на самом деле ничего не нашел.
Спасибо за чтение!
редактировать
Странное поведение снова. Я должен работать в основном над файлами Excel 2003 .xls, но, поскольку на этот вопрос был ответ, я подумал, что смогу проверить свой код против файлов Excel 2007 .xslx. Строка подключения является следующим:
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
Я получаю «внешнюю таблицу не в ожидаемом формате», которое, я считаю, является стандартным исключением, когда существует несоответствие версии между ACE/JET и открытым файлом.
Строка
Provider=Microsoft.ACE.OLEDB.12.0
Означает, что я использую самую последнюю версию OLEDB, я быстро посмотрел, и эта версия используется везде, где нужно подключение к файлам .xlsx.
Я попробовал только с провайдером ванили (просто Excel 12.0, без IMEX и HDR), но я получаю такое же исключение.
Я нахожусь на .NET 2.0.50727 SP2, может быть, время для обновления?
Решение
Я воссоздал вашу ситуацию и после того, как вернул 3 столбца правильно. То есть первые два столбца полностью заполнены данными, и третий, содержащий NULL до последней строки, который имел данные.
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);
adapter.Fill(dt);
Примечание я использовал Access Database Engine(ACE)
поставщик, который сменил старый Joint Engine Technology(JET)
Поставщик, и мои результаты могут представлять разность поведения между ними. Конечно, если вы еще не используете его, я предлагаю использовать ACE
Поставщик, как я считаю, Microsoft тоже. Также обратите внимание на соединение Extended Properties
:
"Hdr = да;" Указывает, что первая строка содержит имена столбцов, а не данные. "Hdr = no;" указывает на противоположность.
"Imex = 1;" Показывает драйверу всегда читать «смешанные» (цифры, даты, строки и т. Д.) Столбцы данных в виде текста. Обратите внимание, что эта опция может повлиять на отрицательный доступ к листу Excel.
Позвольте мне знать, если это помогает.