Pregunta

Estoy tratando de extraer una tabla de valores de una hoja de cálculo Excel (2003) usando vb6, cuyo resultado debe almacenarse en un conjunto de registros (adodb). La tabla se ve así:

    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  

Al conectar y ejecutar la consulta " SELECT * FROM [Sheet1 $] " o incluso una columna específica, " SELECCIONE [Opción # 6] DE [Sheet1 $] " (vea la nota al pie de página 1) y repasando los resultados, me dan los valores de Null para la fila Name9 , Option.4 - > Opción.6 en lugar de los valores correctos 5, 6 y 7. Parece que la conexión a la hoja de cálculo está usando una "suposición mejor" " de decidir cuáles son los límites de tabla válidos, y solo tiene en cuenta un número determinado de filas.

Para conectarme a la hoja de cálculo, probé con los dos proveedores de conexión Microsoft.Jet.OLEDB.4.0 y MSDASQL y obtengo el mismo problema.

Aquí están las configuraciones de conexión que utilizo:

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 & "]")

Este problema solo ocurre cuando hay más de 8 filas (excluyendo los nombres de columna), y he establecido MaxScanRow = 0 para la conexión MSDASQL , pero esto tiene produjo los mismos resultados.

Las referencias notables del proyecto que he incluido son:

  • Biblioteca de MS ActiveX Data Objects 2.8
  • Biblioteca de conjunto de registros 2.8 de objetos de datos de MS ActiveX
  • Biblioteca de objetos de MS Excel 11.0
  • Colección VB 6.0 (SP4) de enlace de datos de MS

¡Cualquier ayuda en este asunto sería muy apreciada!

(1) Por alguna razón, cuando se incluye un punto decimal en el nombre de la columna, se interpreta como un #.


Gracias a todos! A mitad de camino, intenta configurar un Schema.ini " mediante programación " de KB155512 onedaywhen excelente post me indicó la solución:

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

Animaría a cualquier persona con problemas similares a leer la publicación y los comentarios, ya que hay pequeñas variaciones en la solución de una persona a otra.

¿Fue útil?

Solución

Usted está en lo correcto: está adivinando el tipo de datos basado en un número de filas. Existen claves de registro de máquinas locales que puede modificar para influir en el tipo de datos elegido. Para obtener más información, consulte esta respuesta .

Otros consejos

El controlador ISAM de Excel busca por defecto en el primer puñado de filas y adivina su tipo de datos. Si hubiera (más adelante en la tabla) datos que no encajan en el supuesto inicial, frunce el ceño y lo convierte en NULO.

La clave de este problema es

Tu MaxScanRows = 0 . Parece que haría lo correcto (escanea toda la tabla para el tipo de datos a utilizar), pero realmente no lo hace.

Consulte onedaywhen para obtener más información detalles, mi primera información sobre KB282263 no fue el consejo correcto.

El mejor consejo que puedo darte es que dejes de hacerlo en el entorno VB6. Abra Excel, presione ALT + F11 y cargue el IDE de VBA. Pon tu código ahí. Desde este entorno puede acceder al modelo de objetos de Excel completo.

He visto a muchas personas probar e interactuar con Excel de diferentes maneras y todas tienen problemas. Usar la macro VBA o el método de complemento es la mejor manera que he encontrado para obtener los datos. Así es como Microsoft obtiene Excel y Project para integrarse con TFS.

A veces es necesario repensar un poco el proceso para que este enfoque sea adecuado. P.ej. Es posible que necesite que el usuario que está utilizando la hoja de cálculo ejecute una macro que empujará los datos fuera de la hoja de cálculo en lugar de que usted ejecute un proceso para extraer los datos de la hoja de cálculo, pero generalmente es bastante factible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top