Cargar Hoja de Excel a Access mediante Datagridview
Hola amigos una vez más, en este post voy a exponerles un ejemplo que gracias y por codigos de uno de mis amigos de la red José De la Cruz Giron Funes (Honduras) lo adapte y le di unas mejoras para cubrir unas cuestiones que el hacia....gracias Jose por seguir mis pub..Bueno yendo al grano esta aplicación lo que hace es abrir una hoja de excel y la carga en la datagridview y a su vez con otro boton a esa grid la guarda en una base de datos access previamente seleccionada.
Mi captura de la app en diseño
Ahora los codigos
Imports System.Data.OleDb
Public Class Form1
Public conex As New Conectar.ConectarBase 'llama la clase Conectarbase
Dim datafila As DataRow
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim xlRuta As String = ""
Dim Open As New OpenFileDialog
With Open
.Title = "Seleccionar Archivo"
.Filter = "Archivos Excel(*.xls;*.xlsx)|*.xls;*xlsx|Todos los archivos(*.*)|*.*"
.Multiselect = False
.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
If .ShowDialog = Windows.Forms.DialogResult.OK Then
xlRuta = .FileName
End If
End With
Try
Dim xlconection As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (xlRuta & ";Extended Properties=""Excel 12.0;xml; HDR=Yes;IMEX=2"";")))
Dim enconex As New OleDbConnection(xlconection)
Dim cmd As New OleDbCommand("Select * From [Hoja1$]")
Dim ds As New DataSet
Dim da As New OleDbDataAdapter
Dim dt As New DataTable
enconex.Open()
cmd.Connection = enconex
da.SelectCommand = cmd
da.Fill(ds)
dt = ds.Tables(0)
Me.DataGridView1.Columns.Clear()
Me.DataGridView1.DataSource = dt
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim xlRuta As String = ""
Dim Open As New OpenFileDialog
With Open
.Title = "Seleccionar Archivo"
.Filter = "Archivos Access(*.mdb;*.accdb)|*.mdb;*.accdb|Todos los archivos(*.*)|*.*"
.Multiselect = False
.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
If .ShowDialog = Windows.Forms.DialogResult.OK Then
xlRuta = .FileName
End If
End With
Try
Dim contador As Integer = DataGridView1.Rows.Count - 1
Dim ruta As String
Dim tab As String = "SELECT * FROM Mydata ORDER BY n1"
ruta = xlRuta 'System.AppDomain.CurrentDomain.BaseDirectory
' ruta &= "\datac.mdb"
conex.Conectar(ruta, tab) 'direccion de la base de datos
For i As Integer = 0 To contador
datafila = conex.dt.NewRow
datafila("nombre") = DataGridView1.Item(0, i).Value
datafila("n1") = DataGridView1.Item(1, i).Value
datafila("n2") = DataGridView1.Item(2, i).Value
datafila("n3") = DataGridView1.Item(3, i).Value
datafila("n4") = DataGridView1.Item(4, i).Value
conex.dt.Rows.Add(datafila)
conex.da.Update(conex.dt)
' Guardar físicamente los datos en la base
conex.dt.AcceptChanges()
Next
Catch ex As Exception
MessageBox.Show("ERROR al conectar o recuperar los datos:" & vbCrLf & _
ex.Message, "Conectar con la base", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
La clase para guardar en Access
Imports System.Data
Imports System.Data.OleDb
Public Class Conectar
Public Class ConectarBase
Public dt As DataTable
Public da As OleDbDataAdapter
Public fila As Integer
Public ds As New DataSet
Public Function Conectar(ByVal dirPath As String, ByVal tabla As String) As String
Dim sCnn As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dirPath
' La cadena de selección
Dim sSel As String = tabla
' Comprobar si hay algún error
Try
' Crear un nuevo objeto del tipo DataAdapter
da = New OleDbDataAdapter(sSel, sCnn)
' Crear los comandos de insertar, actualizar y eliminar
Dim cb As New OleDbCommandBuilder(da)
' Como hay campos con caracteres especiales,
' al usarlos incluirlos entre corchetes.
cb.QuotePrefix = "["
cb.QuoteSuffix = "]"
' Asignar los comandos al DataAdapter
' (se supone que lo hace automáticamente, pero...)
' da.UpdateCommand = cb.GetUpdateCommand
da.InsertCommand = cb.GetInsertCommand
' da.DeleteCommand = cb.GetDeleteCommand
' Esta base de datos usa el ID con valores automáticos
' da.MissingSchemaAction = MissingSchemaAction.AddWithKey
dt = New DataTable
' Llenar la tabla con los datos indicados
da.Fill(dt)
Catch ex As Exception
MessageBox.Show("ERROR al conectar o recuperar los datos:" & vbCrLf & _
ex.Message, "Conectar con la base", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return Conectar
End Function
End Class
End Class
Y por ultimo la App en Acción
El proyecto: https://mega.co.nz/#!ddNz3Zwa!IjXO4WK3g0T6YXuZk5rG122RmZQ9iVdBqWyvj9Oyrcg
Espero les sea de provecho y nos vemos en otra entrega
Excelente Jose Luis voy a implementarlo inmediatamente en mi proyecto......Mil gracias por ese gran aporte
ResponderEliminarMil gracias Jose Luis no sabe que tanto me va ayudar esto, con esto mi proyecto será de mejor calidad, atte Jose de la Cruz Giron
ResponderEliminarEs excelente tu aporte me a ahorrado buen tiempo , aprecio mucho tu tiempo por compartirlo
ResponderEliminarmuchas gracias
ah! despues de probarlo no me actualiza solo añade registros a BD acces, por favor una ayuda para que actualize sin volver a insertarlo
atte.
Aladino Aliaga (Peru)
buena idea, voy a ver que se puede hacer
ResponderEliminar