none
Exportar DatagridView a Excel o Texto RRS feed

  • Pregunta

  • Hola amigos.

    Quisiera que me ayudaran, tengo un DatagridView que lleno mediante una consulta que devuelve mas de 50 mil registros y cuando lo exporto se demora mucho mucho tiempo, pero los primeros registros los exporta rápido pero a medida que va exportando se hace muy lento.

    quisiera que me digan cual es la manera mas rápida y optima de exportar datos a excel o un plano, no importa si hay que hacerlo en c# o en vb, si con DataSets, DataTables, Linq etc. Lo que quiero es que no se tarde tanto en sacar el archivo.

    muchas Gracias.


    ...:::2TB:::... [Temble The Big Boss]

    viernes, 11 de mayo de 2012 17:28

Respuestas

  • "Temble" escribió:

    > Quisiera que me ayudaran, tengo un DatagridView que lleno mediante una
    > consulta que devuelve mas de 50 mil registros y cuando lo exporto se
    > demora mucho mucho tiempo, ...

    Hola:

    Si no es mucho preguntar, ¿es sumamente necesario que muestres los datos en el control DataGridView? ¿De donde tomas los datos? ¿Quizás desde alguna tabla de una base de datos?

    Si la respuesta es afirmativa, en el siguiente enlace encontrarás la manera para crear un archivo de texto delimitado con los datos devueltos por una consulta SQL de selección:

    Cómo crear un archivo de texto delimitado con los datos existentes en un objeto DataTable

    Como no has indicado el código que estás utilizando para crear el archivo de Excel, tampoco te puedo indicar si éste es más rápido que el que estás utilizando, aunque sí te puedo decir que es más rápido que utilizar los objetos de la propia biblioteca de Excel.

    De todas maneras, si necesitas mostrar previamente los datos en el control DataGridView (no conozco persona que trabaje a la misma vez con 50.000 registros), simplemente es cuestión de referenciar el objeto DataTable enlazado con el control DataGridview para crear el archivo de texto.

    Una vez que tengas creado el archivo de texto, lo puedes utilizar para crear un nuevo libro de Excel, haciendo uso conjunto de los ISAM de Excel y Texto de los motores de datos Microsoft Jet (hasta Excel 2003) o Microsoft ACE (para Excel 2007 o superior).

    Para crear una nueva hoja de cálculo con los datos del archivo de texto en un libro de Excel 2007, ejecutarías algo parecido a lo siguiente:

     
        ' Creamos una conexión OleDb con el archivo de texto. 
        ' Observa que en el parámetro Data Source se especifica 
        ' sólo la ruta de la carpeta que almacena el archivo de texto. 
        ' 
        Using cnn As New OleDbConnection( _ 
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
                "Data Source=C:\Mis documentos;" & _ 
                "Extended Properties='TEXT;'")
     
                ' Creamos la consulta SQL de creación de tabla 
                ' 
                Dim sql As String = _ 
                    "SELECT * INTO NombreRango " & _ 
                    "IN ''[Excel 12.0 Xml;DATABASE=C:\Mis documentos\Libro1.xlsX]" & _ 
                    "FROM Nombre_Archivo#txt"
     
                Try 
                    ' Creamos un objeto OleDbCommand para ejecutar la consulta 
                    ' 
                    Dim cmd As New OleDbCommand(sql, cnn)
     
                    ' Abrimos la conexión 
                    ' 
                    cnn.Open()
     
                    ' Ejecutamos la consulta. 
                    ' 
                    Dim n As Int32 = cmd.ExecuteNonQuery()
     
                    MessageBox.Show("Nº Registros afectados: " & CStr(n))
     
                Catch ex As Exception 
                    MessageBox.Show(ex.Message)
     
                End Try
     
        End Using

    Si por casualidad el libro de Excel es de la versión 2000-2003, utilizarías en la cadena de conexión el siguiente proveedor de datos:

     Using cnn As New OleDbConnection( _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Mis documentos;" & _
        "Extended Properties='TEXT;'")

    Y para conectarte con Excel, utilizarías el siguiente ISAM:

     ' Creamos la consulta SQL de creación de tabla
     '
     Dim sql As String = _
       "SELECT * INTO NombreRango " & _
       "IN ''[Excel 8.0;DATABASE=C:\Mis documentos\Libro1.xls]" & _
       "FROM Nombre_Archivo#txt"
     
    El código anterior hará que se cree una nueva hoja de cálculo y un nuevo rango de celdas con nombre que se llamarán de igual manera, «NombreRango» en el caso del ejemplo que te he indicado.
     
    Una vez que hayas exportado los datos al libro correspondiente de Excel, ya puedes eliminar del disco el archivo de texto temporal creado, cuestión ésta que me imagino conocerás la manera de hacerlo. :-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    sábado, 12 de mayo de 2012 16:54
    Moderador

Todas las respuestas

  • devuelve mas de 50 mil registros y cuando lo exporto se demora mucho mucho tiempo

    pero es mas que logico, son 50mil registros que esperas que no demore

    el control grid no esta pensado para cargar este volumen de registros, es una locura cargar ese numero de datos

    deberias proporcionar filtros o paginado del grid para poder analziar los datos

    o si se requiere ver un gran numero de registro crear un reporte, usando Reporting Service o Crystal Reports, estos si estan pensados para mostrar listado grandes de datos, pero el datagridview no

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 11 de mayo de 2012 17:41
  • si es mas que lógico , pero he visto programas como MYSQL-FRONT o MYSQL Manager que exportan aun mas cantidad de datos de información en menor tiempo y sin importar el formato (txt, xls, csv).

    lo que quiero saber es si hay alguna forma mas optima realizar una exportación, asi sea de un datagridView, DataSets, Datatables, procesos desatendidos en batch o algo asi, o si es necesario otro lenguaje

    Muchas Gracias.


    ...:::2TB:::... [Temble The Big Boss]


    viernes, 11 de mayo de 2012 20:24
  • "Temble" escribió:

    > Quisiera que me ayudaran, tengo un DatagridView que lleno mediante una
    > consulta que devuelve mas de 50 mil registros y cuando lo exporto se
    > demora mucho mucho tiempo, ...

    Hola:

    Si no es mucho preguntar, ¿es sumamente necesario que muestres los datos en el control DataGridView? ¿De donde tomas los datos? ¿Quizás desde alguna tabla de una base de datos?

    Si la respuesta es afirmativa, en el siguiente enlace encontrarás la manera para crear un archivo de texto delimitado con los datos devueltos por una consulta SQL de selección:

    Cómo crear un archivo de texto delimitado con los datos existentes en un objeto DataTable

    Como no has indicado el código que estás utilizando para crear el archivo de Excel, tampoco te puedo indicar si éste es más rápido que el que estás utilizando, aunque sí te puedo decir que es más rápido que utilizar los objetos de la propia biblioteca de Excel.

    De todas maneras, si necesitas mostrar previamente los datos en el control DataGridView (no conozco persona que trabaje a la misma vez con 50.000 registros), simplemente es cuestión de referenciar el objeto DataTable enlazado con el control DataGridview para crear el archivo de texto.

    Una vez que tengas creado el archivo de texto, lo puedes utilizar para crear un nuevo libro de Excel, haciendo uso conjunto de los ISAM de Excel y Texto de los motores de datos Microsoft Jet (hasta Excel 2003) o Microsoft ACE (para Excel 2007 o superior).

    Para crear una nueva hoja de cálculo con los datos del archivo de texto en un libro de Excel 2007, ejecutarías algo parecido a lo siguiente:

     
        ' Creamos una conexión OleDb con el archivo de texto. 
        ' Observa que en el parámetro Data Source se especifica 
        ' sólo la ruta de la carpeta que almacena el archivo de texto. 
        ' 
        Using cnn As New OleDbConnection( _ 
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
                "Data Source=C:\Mis documentos;" & _ 
                "Extended Properties='TEXT;'")
     
                ' Creamos la consulta SQL de creación de tabla 
                ' 
                Dim sql As String = _ 
                    "SELECT * INTO NombreRango " & _ 
                    "IN ''[Excel 12.0 Xml;DATABASE=C:\Mis documentos\Libro1.xlsX]" & _ 
                    "FROM Nombre_Archivo#txt"
     
                Try 
                    ' Creamos un objeto OleDbCommand para ejecutar la consulta 
                    ' 
                    Dim cmd As New OleDbCommand(sql, cnn)
     
                    ' Abrimos la conexión 
                    ' 
                    cnn.Open()
     
                    ' Ejecutamos la consulta. 
                    ' 
                    Dim n As Int32 = cmd.ExecuteNonQuery()
     
                    MessageBox.Show("Nº Registros afectados: " & CStr(n))
     
                Catch ex As Exception 
                    MessageBox.Show(ex.Message)
     
                End Try
     
        End Using

    Si por casualidad el libro de Excel es de la versión 2000-2003, utilizarías en la cadena de conexión el siguiente proveedor de datos:

     Using cnn As New OleDbConnection( _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Mis documentos;" & _
        "Extended Properties='TEXT;'")

    Y para conectarte con Excel, utilizarías el siguiente ISAM:

     ' Creamos la consulta SQL de creación de tabla
     '
     Dim sql As String = _
       "SELECT * INTO NombreRango " & _
       "IN ''[Excel 8.0;DATABASE=C:\Mis documentos\Libro1.xls]" & _
       "FROM Nombre_Archivo#txt"
     
    El código anterior hará que se cree una nueva hoja de cálculo y un nuevo rango de celdas con nombre que se llamarán de igual manera, «NombreRango» en el caso del ejemplo que te he indicado.
     
    Una vez que hayas exportado los datos al libro correspondiente de Excel, ya puedes eliminar del disco el archivo de texto temporal creado, cuestión ésta que me imagino conocerás la manera de hacerlo. :-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    sábado, 12 de mayo de 2012 16:54
    Moderador