Игнорируемые столбцы, использующие vb6 для извлечения из Excel

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

    Имя Вариант.1 Вариант.2 Вариант.3 Вариант.4 Вариант.5 Вариант.6 
    -----------------------------------------------------------------
    Имя1         2         3         4
    Имя2         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
    Имя9         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 "программно" из KB155512, когда отличный пост указал мне на решение:

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

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

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам