none
Problema al importar datos desde una hoja de Excel hasta un DataGridView RRS feed

  • Pregunta

  • Hola, estoy tratando de importar los datos de una hoja de Excel, el problema es que cuando se importan los datos se colocan al final de  las columnas del datagridview que tengo formateado para esperar los datos de la hoja de excel
        Private Sub btnImportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportar.Click
            'Instanciamos nuestro cuadro de dialogo
            Dim openFileDialog1 As New OpenFileDialog
            'Directorio Predeterminado
            openFileDialog1.InitialDirectory = "C:\"
            'Filtramos solo archivos con extension *.xls
            openFileDialog1.Filter = "Archivos de Microsoft Excel (*.xls)|*.xls"
    
            'Si se presiona abrir entonces...
            If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                'Asignamos la ruta donde se almacena el fichero excel que se va a importar
                txtRutaXLS.Text = openFileDialog1.FileName
    
                On Error Resume Next
                'Instanciamos nuestra cadena de conexion especial para excel,indicando la ruta del fichero
                Dim cadconex As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Me.txtRutaXLS.Text.Trim & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
                Dim cn As New OleDb.OleDbConnection(cadconex)
                Dim cmd As New OleDbCommand
                Dim da As New OleDb.OleDbDataAdapter
                Dim dt As New DataTable
    
                cmd.Connection = cn
                'Consultamos la hoja llamada Sheet1 de nuestro archivo *.xls
                cmd.CommandText = "select * from [Sheet1$]"
                cmd.CommandType = CommandType.Text
    
                da.SelectCommand = cmd
                'Llenamos el datatable
                da.Fill(dt)
                'Llenamos el Datagridview
                dgv.DataSource = dt
                'Ajustamos las columnas del DataGridView
                dgv.AutoSizeColumnsMode = 6
            End If
        End Sub

    miércoles, 29 de julio de 2015 21:09

Respuestas

  • Supongamos que tengo un archivo llamado libro1.xls
    Allí tengo una columna con números enteros. La primera fila de la columna es un texto "pepe"

    Entonces debo indicar al control que no genere la columna. En cambio yo asigno la propiedad DataPropertyName de cada columna generada por mí, con el nombre del campo, en este caso "pepe", en la tabla/sheet.

    Imports System.Data.OleDb
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            dgv.AutoGenerateColumns = False
    	' la columna ya ha sido agregada en diseño
    	' las siguientes propiedades también pueden agregarse desde el diseñador
            dgv.Columns(0).Name = "PEPE"
            dgv.Columns("PEPE").DataPropertyName = "pepe"
            dgv.Columns("PEPE").ValueType = GetType(Integer)
            dgv.Columns("PEPE").HeaderText = "Pepe"
    
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            'Instanciamos nuestra cadena de conexion especial para excel,indicando la ruta del fichero
            Dim cadconex As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "c:\walter\libro1.xls" & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
            Dim cn As New OleDb.OleDbConnection(cadconex)
            Dim cmd As New OleDbCommand
            Dim da As New OleDb.OleDbDataAdapter
            Dim dt As New DataTable
    
            cmd.Connection = cn
            'Consultamos la hoja llamada Sheet1 de nuestro archivo *.xls
            cmd.CommandText = "select * from [Hoja1$]"
            cmd.CommandType = CommandType.Text
    
            da.SelectCommand = cmd
            'Llenamos el datatable
            da.Fill(dt)
            'Llenamos el Datagridview
            dgv.DataSource = dt
            'Ajustamos las columnas del DataGridView
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    
        End Sub
    End Class
    

    El "PEPE" nombre de la columna no es relevante. Puede ser cualquier cosa o puedes usar el índice de la columna en el dgv. El "pepe" que importa es el que pones en la propiedad DataPropertyName.

    miércoles, 29 de julio de 2015 23:34

Todas las respuestas

  • Estimado,

    No recuerdo bien, pero prueba con 

    With tuDataGridView
                    .Rows.Clear()
    End With
    
    

    Antes de insertar el DataTable.

    Saludos.


    miércoles, 29 de julio de 2015 21:29
  • Supongamos que tengo un archivo llamado libro1.xls
    Allí tengo una columna con números enteros. La primera fila de la columna es un texto "pepe"

    Entonces debo indicar al control que no genere la columna. En cambio yo asigno la propiedad DataPropertyName de cada columna generada por mí, con el nombre del campo, en este caso "pepe", en la tabla/sheet.

    Imports System.Data.OleDb
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            dgv.AutoGenerateColumns = False
    	' la columna ya ha sido agregada en diseño
    	' las siguientes propiedades también pueden agregarse desde el diseñador
            dgv.Columns(0).Name = "PEPE"
            dgv.Columns("PEPE").DataPropertyName = "pepe"
            dgv.Columns("PEPE").ValueType = GetType(Integer)
            dgv.Columns("PEPE").HeaderText = "Pepe"
    
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            'Instanciamos nuestra cadena de conexion especial para excel,indicando la ruta del fichero
            Dim cadconex As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "c:\walter\libro1.xls" & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
            Dim cn As New OleDb.OleDbConnection(cadconex)
            Dim cmd As New OleDbCommand
            Dim da As New OleDb.OleDbDataAdapter
            Dim dt As New DataTable
    
            cmd.Connection = cn
            'Consultamos la hoja llamada Sheet1 de nuestro archivo *.xls
            cmd.CommandText = "select * from [Hoja1$]"
            cmd.CommandType = CommandType.Text
    
            da.SelectCommand = cmd
            'Llenamos el datatable
            da.Fill(dt)
            'Llenamos el Datagridview
            dgv.DataSource = dt
            'Ajustamos las columnas del DataGridView
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    
        End Sub
    End Class
    

    El "PEPE" nombre de la columna no es relevante. Puede ser cualquier cosa o puedes usar el índice de la columna en el dgv. El "pepe" que importa es el que pones en la propiedad DataPropertyName.

    miércoles, 29 de julio de 2015 23:34