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

StackOverflow https://stackoverflow.com/questions/229404

Вопрос

Я пытаюсь извлечь таблицу значений из электронной таблицы 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 2.8
  • Библиотека набора записей 2.8 объектов данных MS ActiveX
  • Библиотека объектов MS Excel 11.0
  • Сбор привязки данных MS VB 6.0 (SP4)

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

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


Всем спасибо!На полпути к попытке настроить Schema.ini "программно" из КБ155512 однаждыкогдаотлично почта указал мне на решение:

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Видеть однаждыкогдаответ для получения более подробной информации, моя первая информация о КБ282263 это был не правильный совет.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top