Причудливый SELECT из файла Excel с помощью метода OleDbDataAdapter (C #) - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть файл 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.
Я предполагаю, что движок JET пытается определить тип столбца по типу самой первой ячейки в каждом столбце; в качестве первого значения null весь столбец игнорируется.
Я попытался заполнить нули, и этот код фактически возвращает все три столбца; это, очевидно, наименее предпочтительное решение, потому что мне приходится обрабатывать большое количество маленьких файлов.
Инвертирование диапазона выбора (от «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, может быть, время для обновления?

1 Ответ

7 голосов
/ 01 декабря 2010

Я воссоздал вашу ситуацию, и следующие вернули 3 столбца правильно. То есть первые два столбца полностью заполнены данными, а третий содержит ноль до последней строки, в которой были данные.

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 = Yes"; указывает на то, что первый строка содержит имена столбцов, а не данные. "HDR = No;" указывает на обратное.

"ИМЭКС = 1;" говорит водителю всегда читать "смешанный" (числа, даты, строки и т. д.) столбцы данных в виде текста. Обратите внимание, что этот параметр может повлиять Доступ к записи на листе Excel отрицательный.

Дайте мне знать, если это поможет.

...