none
Usar diferentes libros de excel en importacion RRS feed

  • Pregunta

  • Saludos expertos,

    He utilizado este código para importar una hoja de excel a un DataGridView y luego insertarlo en una tabla de sql server. Pero con este código solo puedo seleccionar un libro que tenga el nombre "MIGRAR_NOMINA, he probado con variables pero me presenta un error y necesito saber cual seria el método para seleccionar un libro de excel sin importar el nombre del archivo.

    Private Sub MONTAR_ARCHIVO()
            Try
                Dim ExcelCN As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" & _
                                                        "Data Source = " + TXT_RUTA.Text + ";" & _
                                                            "Extended Properties = 'Excel 12.0 Xml;HDR=Yes'")

                Dim OleAD As New OleDbDataAdapter("SELECT * FROM [" & TXT_HOJA.Text & "MIGRAR_NOMINA$]", ExcelCN)

                Dim DT As New DataTable
                ExcelCN.Open()
                OleAD.Fill(DT)
                ExcelCN.Close()
                Me.DGV_MIGRADOS.DataSource = DT

            Catch ex As Exception
                MsgBox("NO SE HA SELECCIONADO LIBRO DE EXCEL")
            End Try

        End Sub

            
    martes, 19 de febrero de 2013 19:19

Respuestas

  • "soyeddygh" preguntó:

    > necesito saber cual seria el método para seleccionar un libro
    > de excel sin importar el nombre del archivo.

    Hola:

    El método consiste en crearte una función que acepte la ruta del libro de Excel y la hoja de cálculo cuyos datos deseas leer.

    Inserta en tu formulario la siguiente función:

    Imports System.Data.OleDb
    
        Private Function GetDataExcel(ruta As String, nombreHoja As String) As DataTable
    
            ' Comprobación de los valores de los parámetros.
            '
            If (String.IsNullOrEmpty(ruta)) OrElse (String.IsNullOrEmpty(nombreHoja)) Then
                Return Nothing
            End If
    
            Try
                ' Construimos la cadena de conexión de acuerdo
                ' al valor del parámetro 'ruta' especificado.
                '
                Dim cadenaConexion As String = _
                    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                    "Extended Properties='Excel 12.0 Xml;HDR=Yes';" & _
                    "Data Source=" & ruta
    
                Using cnn As New OleDbConnection(cadenaConexion)
    
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    ' Construimos la consulta SQL de selección
                    cmd.CommandText = String.Format("SELECT * FROM [{0}$]", nombreHoja)
    
                    Dim da As New OleDbDataAdapter(cmd)
    
                    Dim dt As New DataTable()
    
                    da.Fill(dt)
    
                    Return dt
    
                End Using
    
            Catch
                Throw
    
            End Try
    
        End Function

    Cuando desees obtener un objeto DataTable, llamarías a la función de la siguiente manera:

            Try
                ' Recuperamos los datos
                Dim dt As DataTable = GetDataExcel(TXT_RUTA.Text, TXT_HOJA.Text)
    
                ' Mostramos los datos en un control DataGridView
                DataGridView1.DataSource = dt
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try

    Es decir, algo parecido a:

        Dim dt As DataTable = GetDataExcel( _
          "C:\Carpeta\Libro.xlsx", "Hoja1")

    Fíjate que NO ES NECESARIO que el nombre de la hoja de cálculo acabe con el signo $, porque de ello se encarga el método String.Format que se ejecuta en la función GetDataExcel:

        cmd.CommandText = String.Format("SELECT * FROM [{0}$]", nombreHoja)

    Esta es la manera correcta y "certificada" de obtener datos de un libro de Excel cualquiera. Por supuesto, sólo sirve para leer hojas de cálculo completas. No sirve para leer un rango de celdas con nombre, porque en éste caso el nombre del rango de celdas NO PUEDE ACABAR EN $.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    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, activa la instrucción Option Strict.



    martes, 19 de febrero de 2013 19:32
    Moderador