Buscar en Google

Busca en Todo Vb-Net

Búsqueda personalizada

miércoles, 19 de junio de 2013

Exportar DataGridView a Microsoft Excel

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...


29 comentarios:

  1. Muy buen aporte, mil gracias

    ResponderEliminar
  2. Para que te de los nombres de las cabeceras que tienes en tu DGV, reemplazaría el código siguiente:
    For 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

    ResponderEliminar
    Respuestas
    1. Todavia quedaría mejor si se le pone HEADER TEXT

      Eliminar
  3. Funciona todo Ok gracias , ahora para los que quieran agregar un nombre personalizado a las columnasimporten esto

    Imports 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

    ResponderEliminar
  4. como seria si quisiera que me guardare automaticamente el excel

    ResponderEliminar
  5. Esto funciona para excel 2013?? porque yo lo implemente y no me tira error pero tampoco me abre el excel

    ResponderEliminar
  6. WOOOOOOOOOOOOOOOOOWWWW 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

    ResponderEliminar
  7. Muchisimas gracias por tu aporte!! He podido tener un plus a mi desarrollo.

    De verdad, gracias!

    Saludos cordiales

    ResponderEliminar
  8. Muchas gracias!, me sirvió saludos!

    ResponderEliminar
  9. Lo mandas llamar con: GridAExcel('aqui pones el nombre de tu grid)
    saludos!

    ResponderEliminar
  10. 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

    ResponderEliminar
  11. 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

    ResponderEliminar
  12. Recuerda que el script recorre las cada fila y columna para volcarlo a excel

    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

    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.



    ResponderEliminar
    Respuestas
    1. Prueba tambien en otro equipo, tambien puede ser un tema de recursos

      Eliminar
  13. Amigo muchas gracias, tengo una consulta, como debería ser el código si solo quiero exportar un grupo de celdas seleccionadas

    ResponderEliminar
  14. Gracias 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?

    ResponderEliminar
  15. y ese va en el load o en un botón?

    ResponderEliminar
  16. Saludos ayuda alguien ya hizo como Exportar y Importar lo necesito porfa alguien que me ayude

    ResponderEliminar
  17. Una genialidad .... gracias, buscaba algo asi desde hace tiempo, una sola fucion para todos los datagridview.
    una 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??

    ResponderEliminar
  18. Hola me manda error en Microsoft.Office.Interop.Excel.Application
    y llas otras dos filas de abajo

    ¿Que librerioas tengo que importar ?? gracias

    ResponderEliminar
  19. me puedes mandar el proyecto a mi correo? enric.andilla.lopez@hotmail.com

    ResponderEliminar
  20. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim 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

    ResponderEliminar
    Respuestas
    1. Espero les sirva el codigo de muestra para poder importar un excel a un BBDD Access.

      Eliminar