none
Exportar datos de un datagridview wn vb.net a una hoja de excel!! RRS feed

  • Pregunta

  • Hola a todos!!

    Lo que pasa es, que necesito un código para poder pasar los datos que tengo en mi datagridview en vb.net, mi base de datos está en sql, tengo un código pero sólo me pasa a excel el nombre de las columnas yno envía ningún dato de la bd, espero que me puedan ayudar, en seguida les muestro el código...

    Imports Microsoft.Office.Core
    Imports Microsoft.Office.Interop




      Dim m_Excel As New excel.Application
            Dim objLibroExcel As excel.Workbook
            Dim objHojaExcel As excel.Worksheet
            'Dim objHojaExcel2 As Excel.Worksheet
            m_Excel = New excel.Application
            m_Excel.Visible = True
            objLibroExcel = m_Excel.Workbooks.Add()
            objHojaExcel = objLibroExcel.Worksheets(1)
            objHojaExcel.Name = "hojaX 1"
            

            objHojaExcel.Range(objHojaExcel.Cells(1, 1), objHojaExcel.Cells(1, 1)).Interior.ColorIndex = 37
            'objHojaExcel.Range(objHojaExcel.Cells(1, 1), objHojaExcel.Cells(1, 1)).Interior.Pattern = XlPattern.xlPatternSolid
            objHojaExcel.Range(objHojaExcel.Cells(1, 1), objHojaExcel.Cells(1, 1)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 2), objHojaExcel.Cells(1, 2)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 2), objHojaExcel.Cells(1, 2)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 3), objHojaExcel.Cells(1, 3)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 3), objHojaExcel.Cells(1, 3)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 4), objHojaExcel.Cells(1, 4)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 4), objHojaExcel.Cells(1, 4)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 5), objHojaExcel.Cells(1, 5)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 5), objHojaExcel.Cells(1, 5)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 6), objHojaExcel.Cells(1, 6)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 6), objHojaExcel.Cells(1, 6)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 7), objHojaExcel.Cells(1, 7)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 7), objHojaExcel.Cells(1, 7)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 8), objHojaExcel.Cells(1, 8)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 8), objHojaExcel.Cells(1, 8)).Font.Bold = True

            objHojaExcel.Range(objHojaExcel.Cells(1, 9), objHojaExcel.Cells(1, 9)).Interior.ColorIndex = 37
            objHojaExcel.Range(objHojaExcel.Cells(1, 9), objHojaExcel.Cells(1, 9)).Font.Bold = True

            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "a") = "Registro"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "b") = "Material"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "c") = "Cantidad"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "d") = "Centro De Costos"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "e") = "Descripcion"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "f") = "Costo"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "g") = "Confirmacion"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "h") = "Folio"
            objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
            objHojaExcel.Cells(1, "i") = "Fecha"

    ya agregue la referencia de office, pero no me manda los datos que necesito.

    Por favor ayudenme.

    Gracias.


    jueves, 23 de julio de 2009 14:07

Respuestas

  • Olvidate de toda la historia que has visto hasta ahora
    vamos a empezar desde el principio, no sabia que eras novatita, 

    todo lo que tenias anteriormente es basura

    inserta un boton y agregale lo siguiente:


    Private appExcel As Excel.Application
    Private wbExcel As Excel.Workbook
    System.Threading.Thread.CurrentThread.CurrentCulture = _ System.Globalization.CultureInfo.CreateSpecificCulture("en-US") Dg.SelectAll() Dg.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText Clipboard.SetDataObject(Dg.GetClipboardContent())  
    	'Dg es el nombre del datagrid, cambiaselo segun el nombre que tenga
    
            appExcel = New Excel.Application
            appExcel.SheetsInNewWorkbook = 1
            wbExcel = appExcel.Workbooks.Add
             appExcel.Visible = True
    
     wbExcel.Worksheets(1).range("A1").Select()
     wbExcel.Worksheets(1).Paste()





    corre tu programa y dame el detalle de donde falla
    segun yo, ya deberia de funcionar asi

    aqui te espero
    • Propuesto como respuesta kakaroto2012 jueves, 23 de julio de 2009 16:45
    • Marcado como respuesta marpao jueves, 23 de julio de 2009 18:53
    jueves, 23 de julio de 2009 16:18
  • en el evento keypress

            'Solo deja entrar Números

            If InStr("0123456789", e.KeyChar) = False Then

                If (Asc(e.KeyChar)) <> 8 And (Asc(e.KeyChar)) <> 46 And (Asc(e.KeyChar)) <> 45 Then

                    e.Handled = True

                End If

            End If

     

                                              'si quieres que entras mas cosas agregalas al if  de arriba por ejemplo
           
    'Ascii

            '8  = Retroceso

            '45 = guion/Negativo -

            '46 = Punto Decimal

            '47 = Diagonal

            '58 = dos Puntos Decimales

    • Marcado como respuesta marpao viernes, 24 de julio de 2009 14:09
    jueves, 23 de julio de 2009 18:35

Todas las respuestas

  • "marpao" escribió:

    > ... mi base de datos está en sql, ...

    Si dices que tu base de datos es Microsoft SQL Server, ¿para qué necesitas pasar los datos de tu control DataGridView a un libro de trabajo de Excel? ¿No será más fácil pasarlos directamente a la base de SQL Server? ¡Digo yo!


    Enrique Martínez [MS MVP - VB]
    jueves, 23 de julio de 2009 14:37
    Moderador
  • Pues es que en ningún lado veo donde le indicas que te exporte los datos
    solo le estás mandando los encabezados

    mira no te compliques haz lo siguiente




    'copia los datos de tu grid a memoria y pondo antes de tu código que ya tienes
    DataGridView1.SelectAll()
            DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Clipboard.SetDataObject(Dg.GetClipboardContent())

    y luego lo siguiente ponlo al final de tu código


     objLibroExcel.Worksheets(1).range("A1").Select()
     objLibroExcel.Worksheets(1).Paste()



    con eso deberia de pasar los datos a excel
    cualquier cosa aqui estamos


    jueves, 23 de julio de 2009 14:51
  • DataGridView1.SelectAll()
            DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

    jueves, 23 de julio de 2009 14:53
  • Hola SoftJaén!!

    Lo que pasa es, que me piden que los exporte e axcel ya que no quieren utilizar los crystal reports para poder imprimir los datos de la bd, por eso quiero pasarlos a excel.
    jueves, 23 de julio de 2009 14:57
  • Hola omar:

    Gracias por responderme

    ok pero el gridview se esta actualizando constantemente, ésto en onsecuencia de que la bd se actualiza igual constantemente, entonces no entiendo como que copiar los datos del gridview.

    además si los pongo así nadamás pues va a marcar errores, no?

    otra cosa, sería poner los datos, después el código que mostre arriba, y depués el código que me diste tú?
    jueves, 23 de julio de 2009 15:02
  • Aunque se esté actualizando constantemente no es problema

    copias y pegas se actualiza copiar y pegas se actualiza copias y pegas

    DataGridView1.SelectAll()
            DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

    este codigo es quien copia los datos del gridview

    luego entonces, inicializas excel como ya lo hiciste y lo pegas con

     objLibroExcel.Worksheets(1).range("A1").Select()
     objLibroExcel.Worksheets(1).Paste()

    al final, cualquier duda  m_omar_olguin@hotmail.com
    jueves, 23 de julio de 2009 15:09
  • ¡Pues si supieras lo fácil que es pasar los datos del DataGridView directamente a la base de datos de SQL Server! :-))

    Para pasarlos a Excel, échale un vistazo a respuestas efectuadas por mí en el grupo de noticias en español de Visual Basic .net:

    http://groups.google.es/group/microsoft.public.es.dotnet.vb/search?hl=es&group=microsoft.public.es.dotnet.vb&q=pasar+excel+author%3Asoftja%C3%A9n
    Enrique Martínez [MS MVP - VB]
    jueves, 23 de julio de 2009 15:10
    Moderador
  • hola,

    al menos por el codigo que se ve en el codigo en ningun momento estas creando una conexion a la db, y creando las sentencias de sql para insertar los valores.

    o sea alli vemos que trabajas con el excel, pero podrias postear como te conectas a la db, lo haces con consultas armadas dinamicamenteo o utilziadas DataSet Tipados, o arrastras controles de Bindign a tu form ?

    la solucion difiere segun la tecnica que estas acostumbrado a utilizar

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 23 de julio de 2009 15:11
  • Aquí tengo otro código que me proporcionaron, probe con él, pero me indica un error en la línea que está subrayada; el error que me marca es "El índice no es válido. (Excepción de HRESULT: 0x8002000B (DISP_E_BADINDEX)). Compruebe la Propiedad ErrorCode de la excepsión para determinar HRESULT devuelto por el objetoCOM." y no entiendo a que se refiere

    Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click
            Dim xlApp As Excel.Application
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet
            Dim misValue As Object = System.Reflection.Missing.Value
            Dim i As Integer
            Dim j As Integer

            xlApp = New Excel.ApplicationClass
            xlWorkBook = xlApp.Workbooks.Add(misValue)

            xlWorkSheet = xlWorkBook.Sheets("sheet1")


            For i = 0 To DataGridView1.RowCount - 2
                For j = 0 To DataGridView1.ColumnCount - 1
                    xlWorkSheet.Cells(i + 1, j + 1) = _
                        DataGridView1(j, i).Value.ToString()
                Next
            Next

            xlWorkSheet.SaveAs("C:\vbexcel.xlsx")
            xlWorkBook.Close()
            xlApp.Quit()

            releaseObject(xlApp)
            releaseObject(xlWorkBook)
            releaseObject(xlWorkSheet)

            MsgBox("You can find the file C:\vbexcel.xlsx")
        End Sub



    Private Sub releaseObject(ByVal obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
     End Sub
    jueves, 23 de julio de 2009 15:12
  • no es necesario ni siquiera ver como se está conectando
    solo quiere pasar sus datos del DatagridView a excel
    no se compliquen tanto
    jueves, 23 de julio de 2009 15:12
  • cambia esa linea por la siguiente

    xlWorkSheet = xlWorkBook.Sheets(1)
    jueves, 23 de julio de 2009 15:14
  •     Public appExcel As Excel.Application
        Public wbExcel As Excel.Workbook
    
            System.Threading.Thread.CurrentThread.CurrentCulture = _
          System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
    
    
     Dg.SelectAll()
            Dg.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Clipboard.SetDataObject(Dg.GetClipboardContent())
            Iniciar_Excel()
    
    
    
            appExcel = New Excel.Application
            appExcel.SheetsInNewWorkbook = 1
            wbExcel = appExcel.Workbooks.Add
             appExcel.Visible = True
    
     wbExcel.Worksheets(1).range("A1").Select()
     wbExcel.Worksheets(1).Paste()
    • Propuesto como respuesta Paola Quiroz lunes, 9 de agosto de 2010 0:44
    jueves, 23 de julio de 2009 15:20
  • tal vez no me explique bien, lo que quiero es pasar los datos de un gridview a excel, los datos del grdview los traigo de la bd que esta en sql, pr medio de un botón el cual tiene la función de refresh, el botón lo programe utilizando un SELECT, lo que hago es primero dar click al botón refresh, ésto hace que se pasen al grdview los datos de la bd, tengo un botón que es el que utilizaré para mandarlos a excel, eso es lo que hago, no sé si ahora si me explique.

    Omar voy a cambiar esa línea a ver que pasa
    jueves, 23 de julio de 2009 15:23
  • ay no Omar, ya me desespere, me podrías explicar un poco más detalladito lo del primer código que te envié, así que me pongas un ejemplode como sería, eso de copiar y pegar, después el código tuyo, después el mío, o cómo, es que soy novatita en esto de la programación, y la aplicación que estoy haciendo es para mi proyecto final y ya me desespere, me podrías poner el orden de los codigos por favor, necesito mucho de tu ayuda, pero porfis ayudame
    jueves, 23 de julio de 2009 15:37
  • tienes messenger?

    agregame m_omar_olguin@hotmail.com

    jueves, 23 de julio de 2009 15:56
  • si te agrego pero no tengo messenger, lo que pasa es que estoy en mi trabajo bueno haciendo mis practicas en una fabrica y no tengo acceso al messenger sólo a hotmail para ver mi correo, que podemos hacer?

    jueves, 23 de julio de 2009 16:07
  • Olvidate de toda la historia que has visto hasta ahora
    vamos a empezar desde el principio, no sabia que eras novatita, 

    todo lo que tenias anteriormente es basura

    inserta un boton y agregale lo siguiente:


    Private appExcel As Excel.Application
    Private wbExcel As Excel.Workbook
    System.Threading.Thread.CurrentThread.CurrentCulture = _ System.Globalization.CultureInfo.CreateSpecificCulture("en-US") Dg.SelectAll() Dg.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText Clipboard.SetDataObject(Dg.GetClipboardContent())  
    	'Dg es el nombre del datagrid, cambiaselo segun el nombre que tenga
    
            appExcel = New Excel.Application
            appExcel.SheetsInNewWorkbook = 1
            wbExcel = appExcel.Workbooks.Add
             appExcel.Visible = True
    
     wbExcel.Worksheets(1).range("A1").Select()
     wbExcel.Worksheets(1).Paste()





    corre tu programa y dame el detalle de donde falla
    segun yo, ya deberia de funcionar asi

    aqui te espero
    • Propuesto como respuesta kakaroto2012 jueves, 23 de julio de 2009 16:45
    • Marcado como respuesta marpao jueves, 23 de julio de 2009 18:53
    jueves, 23 de julio de 2009 16:18
  • nono no, de verdad que mil gracias, ya funciono, ijole me salvaste la vida jaja

    te lo agradezco muxisimo, eres mi angel jaja

    ya funcionó tal y como lo quiero

    muxisimas gracias una vez más!!

    Saludos
    jueves, 23 de julio de 2009 16:39
  • ok, me da gusto poder ser util
    ya me gané unos besitos jejejeje


    jueves, 23 de julio de 2009 16:45
  • jeje, oie Omar vas a decir que como molesto, es que ahora no se si me puedas proporcionar unos codiguitos para validar cajas de texto numericas, decimales y de texto, esque creo que ya es lo último que me falta pára poder terminar con mi proyectito,  si  no es mucha molestia...
    jueves, 23 de julio de 2009 18:04
  • no es ningun problema
    deja te los pego

    y califica mi respuesta anterior va?
    jueves, 23 de julio de 2009 18:17
  • en el evento keypress

            'Solo deja entrar Números

            If InStr("0123456789", e.KeyChar) = False Then

                If (Asc(e.KeyChar)) <> 8 And (Asc(e.KeyChar)) <> 46 And (Asc(e.KeyChar)) <> 45 Then

                    e.Handled = True

                End If

            End If

     

                                              'si quieres que entras mas cosas agregalas al if  de arriba por ejemplo
           
    'Ascii

            '8  = Retroceso

            '45 = guion/Negativo -

            '46 = Punto Decimal

            '47 = Diagonal

            '58 = dos Puntos Decimales

    • Marcado como respuesta marpao viernes, 24 de julio de 2009 14:09
    jueves, 23 de julio de 2009 18:35
  •   Public appExcel As Excel.Application
    
      Public wbExcel As Excel.Workbook
    
    
    
        System.Threading.Thread.CurrentThread.CurrentCulture = _
    
       System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
    
    
    
    
    
     Dg.SelectAll()
    
        Dg.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
    
        Clipboard.SetDataObject(Dg.GetClipboardContent())
    
        Iniciar_Excel()
    
    
    
    
    
    
    
        appExcel = New Excel.Application
    
        appExcel.SheetsInNewWorkbook = 1
    
        wbExcel = appExcel.Workbooks.Add
    
         appExcel.Visible = True
    
    
    
     wbExcel.Worksheets(1).range("A1").Select()
    
     wbExcel.Worksheets(1).Paste()

    No estaria de mas indicar a los novatos, q el datagridview deberia tener la propiedad Multiselect como True.
    lunes, 9 de agosto de 2010 0:45
  • Hola, aunque este hilo esta algo descolgado me gustaría plantear la misma duda que es:

    Exportar datos de un datagirdView a una tabla Excel mediante un botón, simplemente me gustaría que hiciese eso.

    Tras leer los comentarios no he sacado nada en claro ya que soy bastante novato en Visual Basic, empleo Visual Studio 2010 

    Tengo un boton con el siguiente código que leí por aquí arriba, aunque algo modificado porque me daba fallos.

    El codigo  es el siguiente:

    Public Class Form1

        Private Sub bt_excel_Click(sender As System.Object, e As System.EventArgs) Handles bt_excel.Click
            Dim appExcel As Excel.Application
            Dim wbExcel As Excel.Workbook

            System.Threading.Thread.CurrentThread.CurrentCulture = _
          System.Globalization.CultureInfo.CreateSpecificCulture("en-US")


            dg_excel.SelectAll()
            dg_excel.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
            Clipboard.SetDataObject(dg_excel.GetClipboardContent())

            appExcel = New Excel.Application

            appExcel.SheetsInNewWorkbook = 1
            wbExcel = appExcel.Workbooks.Add
            appExcel.Visible = True

            wbExcel.Worksheets(1).range("A1").Select()
            wbExcel.Worksheets(1).Paste()
        End Sub
    End Class

    Gracias y un saludo.

    miércoles, 18 de abril de 2012 7:40
  • podrías describir mas el error pls

    saludos

    miércoles, 18 de abril de 2012 13:25
  • Gracias ya lo he solucionado, ahora tengo otra duda  y es como se especifica en VisualBasic el formato de fecha que quieres exportar a la tabla de Excel.

    En un TextBox simple al introducir la fecha en formato dd/mm/yy querria que las barras / se fuesen añadiendo a medida que escribo la fecha.

    ejemplo: Introduzco el dia --> 13 y automaticamente el textbox escribe / y pasa a escribir el mes 02 y de nuevo escribe /  pasa al año.

    Espero haberme explicado bien.

    Gracias.

    jueves, 19 de abril de 2012 7:17
  • Como puedo usar un excel ya creado con este ejemplo?
    martes, 12 de marzo de 2013 16:35
  • Amigo dejame decirte que tu codigo funciona a la perfeccion muchas gracias por tu aporte...

    Dios te siga bendiciendo...

    Saludos...


    _ José Ángel Salinas Paz

    viernes, 26 de septiembre de 2014 19:32