none
Leer Excel 95 usando conexión OELDB RRS feed

  • Pregunta

  • Saludos y de antemano, gracias por su ayuda.

    Mi problema es que estoy leyendo un archivo excel de una versión es anterior a 97-2003 usando una conexión OLEDB, pero no me trae todos los datos, específicamente, en la columna "N" los dos primeros datos son fechas y el resto son valores de moneda que quiero tratar como string. El caso es que sólo me lee las dos registros que son tipo fecha y el resto los toma como nulos.

    Leí que el problema se soluciona agregando "IMEX=1" al string de conexión, pero lo hice y no tuvo efecto alguno. Acá muestro el código que estoy usando. 


    Micódigo:

    Sub cargarArchivoOleDb(cArchivoACargar AsString, fechaCorte AsString)

            rutaArchivo = "D:\TSI\Desktop\llibroauxiliarcuentass.20170203.xls"

           Dim ingDeConexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & rutaArchivo & ";Extended Properties=" & Chr(34) & "Excel 5.0;HDR=NO;IMEX=1" & Chr(34)

           'Dim cn As New OleDbConnection(stringDeConexion)

           Dim ejecutorDeComandos As System.Data.OleDb.OleDbDataAdapter

           ejecutorDeComandos = New System.Data.OleDb.OleDbDataAdapter("SELECT  F1 AS CUENTA, F2 AS DESCRIPCION, F9 AS SALDO_INICIAL, F10 AS DEBITOS, F12 AS CREDITOS, F14 AS SALDO_FINAL FROM [Hoja1$]", stringDeConexion)

           Dim tabla As New DataTable

           ejecutorDeComandos.Fill(tabla) 

    EndSub

    Gracias de nuevo, ojalá alguien pueda ayudarme.

                  

     

     

     

     

    lunes, 30 de octubre de 2017 19:43

Respuestas

  • "wilria17" escribió:

    > Mi problema es que estoy leyendo un archivo excel de una versión es anterior
    > a 97-2003 usando una conexión OLEDB, pero no me trae todos los datos,
    > específicamente, en la columna "N" los dos primeros datos son fechas y el
    > resto son valores de moneda que quiero tratar como string. El caso es que
    > sólo me lee las dos registros que son tipo fecha y el resto los toma como nulos.
    >
    > Leí que el problema se soluciona agregando "IMEX=1" al string de conexión,
    > pero lo hice y no tuvo efecto alguno. Acá muestro el código que estoy usando.

    Hola:

    El parámetro IMEX=1 no es siempre una panacea como remedio para que todos los datos se muestren como texto. En la mayoría de los casos funciona cuando en una misma columna aparecen entremezclados datos numéricos y alfanuméricos, pero en tu caso comentas que se entremezclan datos de fecha/hora y de moneda (currency), por lo que en éste caso puede ocurrir cualquier cosa.

    Te remito a la lectura del apartado Los parámetros IMEX y MAXSCANROWS de un artículo sobre el ISAM de Excel que hace ya tiempo escribí:

    Trabajar con ADO, DAO y Excel

    Tampoco vas a perder nada por hacer una prueba incluyendo el parámetro MaxScanRows=0 en las propiedades extendidas de la cadena de conexión:

                Dim cadenaConexion As String =
                    "Provider=Microsoft.Jet.OLEDB.4.0;" &
                    "Data Source=D:\TSI\Desktop\llibroauxiliarcuentass.20170203.xls;" &
                    "Extended Properties='Excel 5.0;HDR=NO;IMEX=1;MaxScanRows=0'"
    

    La verdad es que no sé lo que hacen dos valores de fecha y hora en una columna con valores numéricos con formato de moneda, o viceversa. Debes de procurar que una misma columna contenga los mismos tipos de datos, con independencia que la versión del archivo sea Excel 95 o Excel 2016.

    Si por casualidad quieres evitar las dos primeras filas correspondientes a los valores de fecha/hora, en lugar de especificar en la cláusula FROM todos los datos de la Hoja1, intenta especificar un rango de celdas concreto, como por ejemplo:

    "SELECT  F1 AS CUENTA, F2 AS DESCRIPCION, F9 AS SALDO_INICIAL, F10 AS DEBITOS,
    F12 AS CREDITOS, F14 AS SALDO_FINAL FROM [Hoja1$A3:N50]"

    En el ejemplo tomamos los datos existentes entre las filas 3 y 50, correspondientes a las columnas A y N, ambas inclusive. Adapta el rango a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    lunes, 30 de octubre de 2017 23:20
    Moderador

Todas las respuestas

  • "wilria17" escribió:

    > Mi problema es que estoy leyendo un archivo excel de una versión es anterior
    > a 97-2003 usando una conexión OLEDB, pero no me trae todos los datos,
    > específicamente, en la columna "N" los dos primeros datos son fechas y el
    > resto son valores de moneda que quiero tratar como string. El caso es que
    > sólo me lee las dos registros que son tipo fecha y el resto los toma como nulos.
    >
    > Leí que el problema se soluciona agregando "IMEX=1" al string de conexión,
    > pero lo hice y no tuvo efecto alguno. Acá muestro el código que estoy usando.

    Hola:

    El parámetro IMEX=1 no es siempre una panacea como remedio para que todos los datos se muestren como texto. En la mayoría de los casos funciona cuando en una misma columna aparecen entremezclados datos numéricos y alfanuméricos, pero en tu caso comentas que se entremezclan datos de fecha/hora y de moneda (currency), por lo que en éste caso puede ocurrir cualquier cosa.

    Te remito a la lectura del apartado Los parámetros IMEX y MAXSCANROWS de un artículo sobre el ISAM de Excel que hace ya tiempo escribí:

    Trabajar con ADO, DAO y Excel

    Tampoco vas a perder nada por hacer una prueba incluyendo el parámetro MaxScanRows=0 en las propiedades extendidas de la cadena de conexión:

                Dim cadenaConexion As String =
                    "Provider=Microsoft.Jet.OLEDB.4.0;" &
                    "Data Source=D:\TSI\Desktop\llibroauxiliarcuentass.20170203.xls;" &
                    "Extended Properties='Excel 5.0;HDR=NO;IMEX=1;MaxScanRows=0'"
    

    La verdad es que no sé lo que hacen dos valores de fecha y hora en una columna con valores numéricos con formato de moneda, o viceversa. Debes de procurar que una misma columna contenga los mismos tipos de datos, con independencia que la versión del archivo sea Excel 95 o Excel 2016.

    Si por casualidad quieres evitar las dos primeras filas correspondientes a los valores de fecha/hora, en lugar de especificar en la cláusula FROM todos los datos de la Hoja1, intenta especificar un rango de celdas concreto, como por ejemplo:

    "SELECT  F1 AS CUENTA, F2 AS DESCRIPCION, F9 AS SALDO_INICIAL, F10 AS DEBITOS,
    F12 AS CREDITOS, F14 AS SALDO_FINAL FROM [Hoja1$A3:N50]"

    En el ejemplo tomamos los datos existentes entre las filas 3 y 50, correspondientes a las columnas A y N, ambas inclusive. Adapta el rango a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    lunes, 30 de octubre de 2017 23:20
    Moderador
  • Muchas gracias Enriuqe, realmente me ayudó mucho tu su respuesta. Aún no he leído el artículo que cita en la respuesta, pero con toda seguridad lo haré, pues sólo con las sugerencias que me hizo aquí pude resolver, así que veré que más puedo aprender de su publicación.

    Nuevamente, mil gracias.

    viernes, 3 de noviembre de 2017 14:28