2008-10-23 2 views
0

Я пытаюсь извлечь таблицу значений из таблицы Excel (2003) с помощью vb6, результат которой необходимо сохранить в наборе записей (adodb). Таблица выглядит следующим образом:Игнорируемые столбцы с использованием vb6 для извлечения из excel

 
    Name Option.1 Option.2 Option.3 Option.4 Option.5 Option.6 
    ----------------------------------------------------------------- 
    Name1   2   3   4 
    Name2   2   3   4 
    Name3   2   3   4 
    Name4   2   3   4 
    Name5   2   3   4 
    Name6   2   3   4 
    Name7   2   3   4 
    Name8   2   3   4 
    Name9   2   3   4   5   6   7 

После подключения и выполнения запроса «SELECT * FROM [Sheet1$]» или даже колонки-специфический, «SELECT [Option#6] FROM [Sheet1$]» (см примечание 1) и цикл по результатам, я даюсь Null значения для строка Name9, Option.4 - > Option.6, а не правильные значения 5, 6 и 7. Кажется, что соединение с электронной таблицей использует «наилучшее предположение» о том, какие допустимые пределы таблицы и принимает только определенное количество строк.

Чтобы подключиться к электронной таблице, я попробовал оба поставщика связи Microsoft.Jet.OLEDB.4.0 и MSDASQL и получил ту же проблему.

Вот параметры соединения, которые я использую:

Set cn = New ADODB.Connection 
With cn 
    .Provider = "Microsoft.Jet.OLEDB.4.0" 
    .ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;" 
    - - - - OR - - - - 
    .Provider = "MSDASQL" 
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ 
         "DBQ=" & filePath & ";MaxScanRows=0;" 
    .CursorLocation = adUseClient 
    .Open 
End With 
Set rsSelects = New ADODB.Recordset 
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]") 

Эта проблема возникает только при наличии более 8 строк (за исключением имен столбцов), и я поставил MaxScanRow=0 для MSDASQL связи, но это имеет дали те же результаты.

Известные ссылки на проекты Я Включенные:

  • MS ActiveX Data Objects 2.8 Библиотека
  • MS ActiveX Data Objects Recordset 2,8 Библиотека
  • MS Excel Библиотека 11,0 Объект
  • MS Data Binding Collection VB 6.0 (SP4)

Любая помощь в этом вопросе была бы очень признательна!

(1) По какой-то причине, когда включается десятичная точка в имени столбца, она интерпретируется как #.


Спасибо всем! На полпути через попытку создать Schema.ini «программно» из KB155512onedaywhen «s отлично post указал меня к решению:

.Provider = "Microsoft.Jet.OLEDB.4.0" 
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

Я хотел бы призвать кого-либо с подобными проблемами, чтобы читать почту и комментарии, так как небольшие изменения к решению от одного человека к другому.

ответ

1

Вы правы: он угадывает тип данных, основанный на ряде строк. Существуют локальные ключи реестра компьютера, которые вы можете изменить, чтобы повлиять на выбранный тип данных. Для получения дополнительной информации см. this answer.

+0

По крайней мере, я был на футбольном поле. +1 – Tomalak 2008-10-23 21:04:49

3

Драйвер Excel ISAM по умолчанию просматривает первую часть ваших строк и угадывает их тип данных. Если есть (позже в таблице) данные, которые не вписываются в исходное предположение, он хмурится и превращает его в NULL.

Ваш ключ MaxScanRows=0 является ключом к этой проблеме. Похоже, что это будет делать правильная вещь (сканирование всей таблицы для использования типа данных), но на самом деле этого не происходит.

Ответ на вопрос onedaywhen для получения дополнительной информации, моя первая информация о KB282263 была неправильным советом.

+0

К статье, к которой вы привязаны, относится к текстовым файлам, а не к Excel. Файл schema.ini не может использоваться в сочетании с Excel (что является позором). – onedaywhen 2008-10-23 16:02:15

0

Лучшим советом, который я могу вам дать, является прекращение его работы в среде VB6. Откройте Excel, нажмите ALT + F11 и загрузите среду VBA. Поместите свой код туда. Из этой среды вы можете получить доступ к полной объектной модели Excel.

Я видел, как многие люди пытаются взаимодействовать с Excel разными способами, и у всех есть проблемы. Использование макроса VBA или метода надстройки - лучший способ получить данные. Именно Microsoft получает Excel и проект для интеграции с TFS.

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

+0

Это решение предполагает наличие активного пользователя и некоторого контроля над средой пользователя. Это может быть не так, в частности, если Excel просто используется в качестве механизма ввода данных (например, собирая 50 электронных таблиц из разных сотрудников). Правда, можно включить VBA с рабочей книгой/рабочим листом/шаблоном, но это становится более сложным, если данные будут попадать в различные базы данных (например, реплицированные базы данных по всему миру). Кроме того, это решение предполагает однородность версий Excel. – 2010-09-30 11:24:31

Смежные вопросы