Чтение файла XLS с помощью Microsoft Jet Engine

Я хочу разрешить моему приложению импортировать данные из XLS файлов. Я уже делаю это с CSV файлами и XML файлами, но хотел бы открыть область для пользователей. У меня проблемы с загрузкой файла. Мы загружаем файлы (_4 _, _ 5 _, _ 6_) в набор данных и работаем с ним оттуда. Код загрузки для XLS приведен ниже.

FileInfo fi = new FileInfo(filename);

//create and open a connection with the supplied string
OleDbConnection objOleDBConn;
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName));
objOleDBConn.Open();

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (dt == null || dt.Rows.Count == 0)
{
    return;
}

string sheet = dt.Rows[0]["TABLE_NAME"].ToString();

//then read the data as usual.
OleDbDataAdapter objOleDBDa;
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn);
objOleDBDa.Fill(data);
objOleDBConn.Close();

Итак, мои данные загружаются нормально, но похоже, что они устанавливают типы данных для различных столбцов, и это проблема для одного из моих столбцов. Это битовое поле, и мы решили принять False, True, Yes, No, Y и N. Есть код, который позже переводит это в логическое значение. Это отлично работает в файле CSV (для которого строка подключения отличается), но в XLS, если первые 10 строк говорят FALSE или TRUE, а затем говорят, что 11-я говорит YES, тогда я просто получаю пустую запись. Я предполагаю, что он читает первые несколько записей и на основе этого определяет тип данных?

Вопрос: Есть ли способ отключить механизм определения типа данных столбца на основе первых нескольких записей?


person wdhough    schedule 25.11.2009    source источник
comment
Вы можете попробовать добавить MaxScanRows = 1 к расширенным свойствам строки подключения, а затем иметь текстовые поля в первой строке листа. Я никогда не пробовал, но это может сработать ??   -  person Tester101    schedule 25.11.2009


Ответы (4)


Этот вопрос очень похож на значения ячеек Excel усекаются OLEDB-провайдером. и Чтение Excel в ASP.NET: данные не читаются, если столбец имеет другой формат данных Похоже, в этих других вопросах обсуждается пара рабочих решений.

person Joe Barone    schedule 25.11.2009
comment
Спасибо, но это не совсем полное решение, или не то, которое я искал. Изменение реестра может не сработать, если политика безопасности пользователей заблокировала его правильно? - person wdhough; 26.11.2009

Существует параметр реестра, который сообщает провайдеру Jet, сколько строк нужно прочитать, чтобы определить тип данных для столбца. Думаю, по умолчанию установлено 8. Это:

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

(при необходимости измените версию). В вашем случае он имеет логическое значение и поэтому игнорирует строковое значение «да».

person David M    schedule 25.11.2009
comment
Спасибо, но что произойдет, если у вас нет доступа к реестру, потому что политика безопасности этого пользователя заблокирована. Я не могу поверить, что Microsoft напишет функцию, и чтобы ее отключить, вам нужно настроить функцию для тестирования всего, чтобы узнать, что вы не хотите использовать эту функцию, кажется, наоборот. Спасибо, Уилл - person wdhough; 26.11.2009
comment
Если не считать разделения листа на несколько листов по 8 строк, вы мало что сможете сделать. - person David M; 26.11.2009

Попробуйте этот OleDBAdapter Excel QA, который я опубликовал через переполнение стека.

Я заполнил столбец на листе со всеми ИСТИННЫМИ или ЛОЖНЫМИ, а затем произвольно ввел несколько значений «да» или «нет», и все сработало нормально ...

Запустите в режиме отладки, затем щелкните визуализатор набора данных после его заполнения, чтобы увидеть результаты. Или добавьте это в конец кода для вывода

// DataSet:          
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3];
string rowElevenColumn3 = row11Col3.ToString();
person Brian Wells    schedule 03.05.2011

Уловка состоит в том, чтобы включить строку заголовка как строку, из которой можно вывести тип данных, чтобы все столбцы считывались как строка. Затем вы сможете выполнить синтаксический анализ кода для исправления типа данных, если вам нужно, без потери значений - используйте для этого HDR = Нет

objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source={0};Extended Properties='Excel 8.0;HDR=No;IMEX=1'", fi.FullName));
person CallMeKat    schedule 16.05.2018