Причудливый выберите из файла Excel через метод oledbdataAdapter (C#)

StackOverflow https://stackoverflow.com/questions/4326122

Вопрос

У меня есть файл 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.

Позвольте мне знать, если это помогает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top