Игнорируемые столбцы, использующие vb6 для извлечения из Excel - PullRequest
0 голосов
/ 23 октября 2008

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

    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 Набор записей 2.8 Библиотека
  • Библиотека объектов MS Excel 11.0
  • MS Data Binding Collection VB 6.0 (SP4)

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

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


Спасибо всем! На полпути, пытаясь настроить Schema.ini «программно» из KB155512 onedaywhen превосходный пост указал мне на решение:

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

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

Ответы [ 3 ]

3 голосов
/ 23 октября 2008

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

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

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

1 голос
/ 23 октября 2008

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

0 голосов
/ 23 октября 2008

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

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

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

...