Sencilla funcion para exportar un DataGridView a Microsoft excel
La presente función exporta el contenido de un datagridview a Excel, crear un archivo temporal y lo muestra al usuario, por lo tanto si no almacenas el documento en el entorno grafico de MS Excel, este no será recuperable
Antes debemos adicionar a nuestro proyecto las referencias necesarias (Interop.excel) dependiendo de la version instalada en tu computador.
Public Function GridAExcel(ByVal DGV As DataGridView) As Boolean
'Creamos las variables
Dim exApp As New Microsoft.Office.Interop.Excel.Application
Dim exLibro As Microsoft.Office.Interop.Excel.Workbook
Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet
Try
exLibro = exApp.Workbooks.Add
exHoja = exLibro.Worksheets.Add()
' ¿Cuantas columnas y cuantas filas?
Dim NCol As Integer = DGV.ColumnCount
Dim NRow As Integer = DGV.RowCount
'recorremos todas las filas, y por cada fila todas las columnas
'y vamos escribiendo.
For i As Integer = 1 To NCol
exHoja.Cells.Item(1, i)=DGV.Columns(i-1).Name.ToString
Next
For Fila As Integer = 0 To NRow - 1
For Col As Integer = 0 To NCol - 1
exHoja.Cells.Item(Fila+2, Col+1)=
DGV.Rows(Fila).Cells(Col).Value()
Next
Next
'Titulo en negrita, Alineado
exHoja.Rows.Item(1).Font.Bold = 1
exHoja.Rows.Item(1).HorizontalAlignment = 3
exHoja.Columns.AutoFit()
'para visualizar el libro
exApp.Application.Visible = True
exHoja = Nothing
exLibro = Nothing
exApp = Nothing
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error al exportar a Excel")
Return False
End Try
Return True
End Function
Luego basta con llamar la funcion anteriormente creada y adicionar como parametro el nombre de nuestro grid
GridAExcel(DtgridPacientes)
Y es todo...
Muy buen aporte, mil gracias
ResponderEliminarPara que te de los nombres de las cabeceras que tienes en tu DGV, reemplazaría el código siguiente:
ResponderEliminarFor i As Integer = 1 To NCol
exHoja.Cells.Item(1, i)=DGV.Columns(i-1).Name.ToString
Next
Por este otro:
For i As Integer = 1 To NCol
exHoja.Cells.Item(1, i) = DGV.Columns(i - 1).DataPropertyName.ToString
Next
y a mi gusto así se vuelve perfecto.
Saludos y nuevamente gracias por el aporte
Todavia quedaría mejor si se le pone HEADER TEXT
EliminarGracias! Gran aporte!
ResponderEliminarFunciona todo Ok gracias , ahora para los que quieran agregar un nombre personalizado a las columnasimporten esto
ResponderEliminarImports Microsoft.Office.Interop
declaren esto en las variables
Dim r As Excel.Range
y luego despues de el for
For i As Integer = 1 To NCol
exHoja.Cells.Item(1, i)=DGV.Columns(i-1).Name.ToString
Next
escriban esto
r = exHoja.Range("A1")
r.Value = "NOMBRE COLUMNA 1"
r = exHoja.Range("B1")
r.Value = "NOMBRE COLUMNA 2"
r = exHoja.Range("C1")
r.Value = "NOMBRE COLUMNA 3"
y asi para todas sus columnas si quieren pueden seguir agregando propiedases al encabezad como bordes colores tamaño fuente etc
r.Interior.Color = RGB(155, 187, 89) 'color personalizado
r.BorderAround(, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, ) 'borde por defecto
r.Font.Bold = True 'negrita
r.ColumnWidth = 10 'ancho
r.Font.Size = 10 'tamaño letra
Suerte :D
como seria si quisiera que me guardare automaticamente el excel
ResponderEliminarEsto funciona para excel 2013?? porque yo lo implemente y no me tira error pero tampoco me abre el excel
ResponderEliminarya lo solucione,
Eliminardeci como, hdp
EliminarWOOOOOOOOOOOOOOOOOWWWW mil veces gracias, hermano! eres un genio...pasé días y días tratando de ver como guardaba los datos hasta que por fin lo logré...saludos desde SANTO DOMINGO
ResponderEliminarMuchisimas gracias por tu aporte!! He podido tener un plus a mi desarrollo.
ResponderEliminarDe verdad, gracias!
Saludos cordiales
Muchas Gracias me funciona al 100%
ResponderEliminarMuchas gracias!, me sirvió saludos!
ResponderEliminarLo mandas llamar con: GridAExcel('aqui pones el nombre de tu grid)
ResponderEliminarsaludos!
tengo este codigo, pero tengo muchos registros y muchas columnas, al exportarlo se me demora mas de 5 minutos en abrir el excel, como hago para solucionar esto????? AYUDAAAA POR FAVORR
ResponderEliminartengo este codigo, pero tengo muchos registros y muchas columnas, al exportarlo se me demora mas de 5 minutos en abrir el excel, como hago para solucionar esto????? AYUDAAAA POR FAVORR
ResponderEliminarRecuerda que el script recorre las cada fila y columna para volcarlo a excel
ResponderEliminarFor Fila As Integer = 0 To NRow - 1
For Col As Integer = 0 To NCol - 1
exHoja.Cells.Item(Fila+2, Col+1)=
DGV.Rows(Fila).Cells(Col).Value()
Next
Next
Si el la cantidad de columnas y lineas en tu grid es demaciado grande, Lo que puedes hacer es colocar una progressbar para que el usuario sepa que debe esperar.
Prueba tambien en otro equipo, tambien puede ser un tema de recursos
EliminarAmigo muchas gracias, tengo una consulta, como debería ser el código si solo quiero exportar un grupo de celdas seleccionadas
ResponderEliminarGracias por el aporte, tengo el mismo caso de Manuel, manejo muchos datos y se demora mucho en pasar todos los datos al Excel, que otra forma más ágil se podría hacer?
ResponderEliminary ese va en el load o en un botón?
ResponderEliminarSaludos ayuda alguien ya hizo como Exportar y Importar lo necesito porfa alguien que me ayude
ResponderEliminarUna genialidad .... gracias, buscaba algo asi desde hace tiempo, una sola fucion para todos los datagridview.
ResponderEliminaruna consulta, puede incluirse algo para que copie el formato del dgv? es decir que las celdas que estan centradas queden centradas?
como quiero usar la misma funcion para varios formularios, no puedo poner los parametros generales a la funcion, solo quiero que me copie el formato . se podra??
Espectacular, Gracias.
ResponderEliminarHola me manda error en Microsoft.Office.Interop.Excel.Application
ResponderEliminary llas otras dos filas de abajo
¿Que librerioas tengo que importar ?? gracias
Ya lo logre gracias... :)
Eliminarme puedes mandar el proyecto a mi correo? enric.andilla.lopez@hotmail.com
ResponderEliminarPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ResponderEliminarDim Access As String
Dim excel As String
'======================================= ELIMINAR DATOS ====================================
SupU = MsgBox("Desea actualizar la BBDD de Transporte..?? Ten en cuenta que esta operacion toma unos minutos", vbOKCancel, "Confirmacion")
If SupU = vbOK Then
Try
sql = "DELETE FROM BBDD_VEHICULOS"
cnn.Open()
Dim cmd As New OleDbCommand(sql, cnn)
cmd.ExecuteNonQuery()
cnn.Close()
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Critical)
cnn.Close()
End Try
'======================================= conexion ==========================================
'Try
'========== DA OPCION A BUSCAR EN EL ESCRITORIO EL ARCHIVO A CARGAR
Dim OpenFileDialog1 As New OpenFileDialog()
If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
excel = OpenFileDialog1.FileName
End If
Dim OpenFileDialog2 As New OpenFileDialog()
If OpenFileDialog2.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
Access = OpenFileDialog2.FileName
End If
Dim connect As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1'"
Using conn As New OleDbConnection(connect)
Using cm As New OleDbCommand()
conn.Open()
cm.Connection = conn
cm.CommandText = "INSERT INTO [MS Access;Database=" & Access & "].[BBDD_VEHICULOS] SELECT * FROM [BBDD_PRUEBA$]"
If conn.State = ConnectionState.Open Then
conn.Close()
End If
Try
conn.Open()
Dim n As Integer = cm.ExecuteNonQuery()
conn.Close()
MessageBox.Show("Nº de registros insertados: " & CStr(n))
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Using
Else
MsgBox("Se Cancelo la Operacion", vbInformation, "Operacion Cancelada")
Exit Sub
End If
End Sub
Espero les sirva el codigo de muestra para poder importar un excel a un BBDD Access.
Eliminar