Visual Basic.NET - Exportar en forma rapida GridView a excel

 
Vista:
Imágen de perfil de Francisco Javier

Exportar en forma rapida GridView a excel

Publicado por Francisco Javier (3 intervenciones) el 15/10/2015 18:23:34
Hola a todos

Tengo un problema con como exportar en forma rapida un grid a excel. La forma que lo tengo actualmente cumple la funcion de exportarlo, pero no lo hace rapido, por ejemplo, en un grid que tiene 3000 registros con mas de 10 columnas se demora como 4 minutos en exportarlo.

El codigo recorre el grid al momento de exportarlo, pero estoy buscando alguna manera de que me tome el rango total del grid y exportarlo en forma rapida.

Aca esta el codigo actual.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Sub btn_expo_pend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_expo_pend.Click
        Dim app As Microsoft.Office.Interop.Excel._Application = New Microsoft.Office.Interop.Excel.Application()
        Dim workbook As Microsoft.Office.Interop.Excel._Workbook = app.Workbooks.Add(Type.Missing)
        Dim worksheet As Microsoft.Office.Interop.Excel._Worksheet '= Nothing.worksheet = workbook.Sheets("Hoja1")
        worksheet = workbook.ActiveSheet
        For i As Integer = 1 To dgv_pend_mensa.Columns.Count
            worksheet.Cells(1, i) = dgv_pend_mensa.Columns(i - 1).HeaderText
        Next
        For i As Integer = 0 To dgv_pend_mensa.Rows.Count - 1
            For j As Integer = 0 To dgv_pend_mensa.Columns.Count - 1
                worksheet.Cells(i + 2, j + 1) = dgv_pend_mensa.Rows(i).Cells(j).Value.ToString()
            Next
        Next
 
 
 
        worksheet.PageSetup.Zoom = 85
        worksheet.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlLandscape
        worksheet.PageSetup.LeftMargin = 0
        worksheet.PageSetup.RightMargin = 0
        worksheet.Cells.Font.Size = 9
        worksheet.Rows.Item(1).Font.Bold = 1
        worksheet.Columns.AutoFit()
        worksheet.Columns.HorizontalAlignment = 2
        worksheet.PageSetup.CenterHeader = "Pendientes Mensajero:" & cmb_mensa_pend.Text & "FECHA " & Date.Today & " "
        worksheet.PageSetup.CenterFooter = "Pendientes =" & lbl_cod_pen.Text & ""
        worksheet.PageSetup.PrintTitleRows = "$1:$1"
        worksheet.PageSetup.PrintTitleColumns = "$A:$H"
        app.Visible = True
        GC.Collect()
        txt_cod_pend.Text = ""
        cmb_mensa_pend.Text = ""
        dgv_pend_mensa.Rows.Clear()
 
 
    End Sub
Espero que me puedan ayudar.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Exportar en forma rapida GridView a excel

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 21/11/2015 00:57:37
Para que no cargues tremendo elefante, te sugeriría que pruebes EPPlus, y decidas, solo lo agregas desde tu administrador de paquetes nuget.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por markho (21 intervenciones) el 21/11/2015 03:50:57
la manera mas rapida de exportar de una datagridview a excel es esta :

100,000.00 registro en 2 segundos

primero declaran esta variable en el form
Private dtSource As DataTable

luego muestro los datos de empleados al datagridview

1
2
3
4
5
6
7
8
9
10
11
12
Try
            Dim ds As New DataSet
            Dim cmd As New OleDb.OleDbCommand("SELECT SUCURSALES.nomsucursal as [SUCURSAL], EMPLEADOS.cargo AS [CARGO], EMPLEADOS.Idempleado AS [ID_EMPLEADO], EMPLEADOS.nomempleado AS [NOM_EMPLEADO],distritos.nomdistrito as [DISTRITO], EMPLEADOS.direccion AS [DIRECCION], EMPLEADOS.dni AS [DNI], EMPLEADOS.telefono AS [FONO], EMPLEADOS.activo AS [ACT] FROM DISTRITOS ,SUCURSALES,EMPLEADOS WHERE SUCURSALES.Idsucursal = EMPLEADOS.idsucursal AND  DISTRITOS.Iddistrito = EMPLEADOS.iddistrito and sucursales.nomsucursal like '%" & cmbsucursal.Text & "' and EMPLEADOS.nomEMPLEADO like '%" & txtnomempleado.Text.Trim & "%' AND distritos.nomdistrito like '%" & cmbdistrito.Text.Trim & "' AND empleados.activo like '%" & cmbactivo.Text & "' and empleados.cargo like '%" & TXTidcargo.Text & "'", Cn)
            Dim da As New OleDb.OleDbDataAdapter(cmd)
            da.Fill(ds, "Items")
            dtSource = ds.Tables("Items")
            DGVempleado.DataSource = ds.Tables("Items")
 
        Catch ex As Exception
            If Cn.State = ConnectionState.Open Then Cn.Close()
            MsgBox(ex.Message)
        End Try

y con esto exporto a excel
en realida lo exporta a xml pero es lo mismo ya que lo habre el excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
If DGVcliente.RowCount > 0 Then
                Dim save As New SaveFileDialog
                save.Filter = "ARCHIVO XML (*.xml)|*.xml"
                save.FileName = "EMPLEADOS" & " " & Now.Day & "-" & Now.Month & "-" & Now.Year & ".xml"
                If save.ShowDialog = Windows.Forms.DialogResult.OK Then
                    'If Not IO.File.Exists(save.FileName) Then
                    Dim fs As System.IO.FileStream
                    Dim xtw As System.Xml.XmlTextWriter
                    dtSource.TableName = "items"
                    fs = New System.IO.FileStream(save.FileName, IO.FileMode.Create)
                    xtw = New System.Xml.XmlTextWriter(fs, System.Text.Encoding.Unicode)
                    xtw.WriteProcessingInstruction("xml", "version='1.0'")
                    xtw.WriteProcessingInstruction("mso-application", "progid='Excel.Sheet'")
                    dtSource.WriteXml(xtw)
                    xtw.Close()
                    MsgBox("SE EXPORTO CORRECTAMENTE")
                End If
            Else
                MsgBox("NO HAY DATOS QUE EXPORTAR", MsgBoxStyle.Critical, "VERIFICAR")
                Exit Sub
            End If

lo adeacuas a tus necesidades ....

pero ten en cuanta que para mostrar los 3 mil registros en el datagridview tambien sera lento (imaginate 50,000.00 registro) el datagridview solucione ese problema con paginar el datagridview mostrando de los 50,000.00 registros solamente los 100 primeros y poder avanzar con los siguientes 100 registros y con esto la exportacion es super rapida no importa la cantidad de registros que consultes sera super rapido tanto la carga del datagridview como la exportacion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco Javier

Exportar en forma rapida GridView a excel

Publicado por Francisco Javier (3 intervenciones) el 23/11/2015 17:33:27
Muchas gracias markho por responder pero tengo una duda, en la parte donde pones items que deberia ir en realidad ya que me exporta esto a excel
<?xls version='1.0'?><?mso-application progid='Excel.Sheet'?><DocumentElement />

Esta es mi linea de consulta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Try
		Dim sql1 As String = "SELECT funes.folio,funes.notif as Codigo,funes.ingreso as Fecha_Entrega,funes.rebaje as Rebaje," _
							& "tabla.detalle as Mensajero,received.rcv_razon as Razon_Social,received.rcv_direcc as Direccion," _
							& "received.rcv_comuna as Comuna,received.rcv_rutemp As Rut_Empresa,funes.proceso,procesos.pro_glo As Glosa," _
							& "FUNES.ESTADO AS ESTADO,funes.termino as Fecha_termino, received.rcv_fecent as Fecha_Entrega_Isapre," _
							& "funes.rechazo as Rechazo, funes.notifdev as MensajeroDevolucion, funes.diasdev as DiasDevolucion," _
						& "funes.papeleta as Papeleta, funes.f_rendicion as Rendicion, funes.numrend as NumeroRendicion," _
						& "funes.fecfun as FechaFun, received.rcv_tipfun as TipoFun, FUNES.ANO, FUNES.MES, received.rcv_ano," _
						& "received.rcv_mes, funes.isapre, received.rcv_rutafi, received.rcv_nomafi, funes.carta FROM tabla INNER JOIN" _
						& "(((funes INNER JOIN pend ON funes.folio = pend.folio)INNER JOIN received on received.rcv_folio = pend.folio)" _
					& "INNER JOIN procesos ON procesos.pro_num = funes.proceso)ON tabla.codigo = funes.notif and funes.posta='1'"
 
 
		mensaje.ProgressBar1.Increment(10)
 
		Dim da2 As New OleDbDataAdapter(sql1, cnn)
 
 
		Dim ds2 As New DataSet
 
 
		da2.Fill(ds2, sql1)
 
 
		Dim dt2 As DataTable = ds2.Tables(sql1)
		dgv_consulta.DataSource = dt2
 
	Catch ex As Exception
		MessageBox.Show(ex.Message)
	End Try
	mensaje.Close()
End Using
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por markho (21 intervenciones) el 24/11/2015 02:07:13
estimado solo cambia la consulta no modifiques nada

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Try
 
            Dim ds As New DataSet
 
            Dim cmd As New OleDb.OleDbCommand("SELECT funes.folio,funes.notif as Codigo,funes.ingreso as Fecha_Entrega,funes.rebaje as Rebaje," _
 
							& "tabla.detalle as Mensajero,received.rcv_razon as Razon_Social,received.rcv_direcc as Direccion," _
 
							& "received.rcv_comuna as Comuna,received.rcv_rutemp As Rut_Empresa,funes.proceso,procesos.pro_glo As Glosa," _
 
							& "FUNES.ESTADO AS ESTADO,funes.termino as Fecha_termino, received.rcv_fecent as Fecha_Entrega_Isapre," _
 
							& "funes.rechazo as Rechazo, funes.notifdev as MensajeroDevolucion, funes.diasdev as DiasDevolucion," _
 
						& "funes.papeleta as Papeleta, funes.f_rendicion as Rendicion, funes.numrend as NumeroRendicion," _
 
						& "funes.fecfun as FechaFun, received.rcv_tipfun as TipoFun, FUNES.ANO, FUNES.MES, received.rcv_ano," _
 
						& "received.rcv_mes, funes.isapre, received.rcv_rutafi, received.rcv_nomafi, funes.carta FROM tabla INNER JOIN" _
 
						& "(((funes INNER JOIN pend ON funes.folio = pend.folio)INNER JOIN received on received.rcv_folio = pend.folio)" _
 
					& "INNER JOIN procesos ON procesos.pro_num = funes.proceso)ON tabla.codigo = funes.notif and funes.posta='1'", Cn)
 
            Dim da As New OleDb.OleDbDataAdapter(cmd)
 
            da.Fill(ds, "Items")
 
            dtSource = ds.Tables("Items")
 
            DGVempleado.DataSource = ds.Tables("Items")
 
 
 
        Catch ex As Exception
 
            If Cn.State = ConnectionState.Open Then Cn.Close()
 
            MsgBox(ex.Message)
 
        End Try
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por markho34 (21 intervenciones) el 24/11/2015 02:11:02
solo cambia la consulta por la tuya
no te olvides de declarar en publico del formulario.
Private dtSource As DataTable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco Javier

Exportar en forma rapida GridView a excel

Publicado por Francisco Javier (3 intervenciones) el 24/11/2015 18:51:01
Muchas Gracias markho34 me funciono, ahora voy a averiguar como le doy formato a las celdas y columnas.

Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por markho34 (21 intervenciones) el 24/11/2015 19:37:25
el problema a exportar a xml (excel) son las fechas cuando lo exportas no importa con el formato que deseas .... lo solucione dando formato en la misma consulta en sql (hay una forma averigualo) ademas al exportarlo ... excel no lo toma como fechas mi solucion fue seleccionar las columnas de fechas control + B y en reemplazar "/" por "-" (sin comillas) y listo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por marco (21 intervenciones) el 16/07/2017 04:38:35
estimado puedistes dar formato al xml (en excel) ahora me veo la necesidad de hacerlo . gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exportar en forma rapida GridView a excel

Publicado por Manuelp (1 intervención) el 13/04/2016 00:42:34
fs = New System.IO.FileStream(save.FileName, IO.FileMode.Create)

Me muestra error en esa linea de codigo :/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exportar en forma rapida GridView a excel

Publicado por Claudia (1 intervención) el 24/05/2019 00:06:58
Yo estuve buscando y sólo encontré soluciones rebuscadas con herramientas adicionales.

Entonces se me ocurrió simplemente pasar los datos a un datagridview y hacer un copy-paste y me funcionó rápido y sin problema:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
'Tengo un formulario con un datagrid llamado DtGrTabla
 
Dim dtTabla as new DataTable
 
'Aquí pongo mi código para abrir mi datatable
 
DtGrTabla.DataSource = DtTabla
 
'Abro una hoja de excel
 
Dim HojaExcel As Excel.Application
Dim exBook As Excel.Workbook
HojaExcel = New Excel.Application
exBook = HojaExcel.Workbooks.Add
HojaExcel.Visible = False
 
'Selecciono todo el datagrid y copio su contenido al portapapeles
 
DtGrTabla.SelectAll()
Dim dataObj As DataObject = DtGrTabla.GetClipboardContent
If Not IsNothing(dataObj) Then
    Clipboard.SetDataObject(dataObj)
End If
 
'Selecciono la celda desde la cual quiero copiar y pego
 
HojaExcel.Range("A1").Select()
HojaExcel.ActiveSheet.Paste
 
'Y ya sea que guardes el excel o que lo abras
 
HojaExcel.Visible = True
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exportar en forma rapida GridView a excel

Publicado por Victor Alexander Becerra Dongo (1 intervención) el 12/09/2021 07:57:42
Excelente¡¡¡

Crees que puedo darle formato a una columna especifica del excel ¡¡¡
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Giancarlo
Val: 377
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Exportar en forma rapida GridView a excel

Publicado por Giancarlo (488 intervenciones) el 24/05/2019 18:37:17
Hola, hace tiempo tuve un problema como el tuyo, aunque te demora demasiado (yo descargué medio millon en ese tiempo, 1 millon salió en cerca de 10 minutos con varias columnas, 10 o 20 creo, en fin)

Una solución que hice fue, exportar todo el gridview a un bloc de notas y luego con un comando con el interop del excel importé ese block de notas dentro del excel y se demoró menos de 1 minuto (creo que estoy exagerando), pero fue bastante rápido

Pasaron años, y ahora descubrí closedXML y pues es muy rápido (aun no probé con millones de registros, pero en fin) además que no necesita que tengas instalado el excel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Yenier
Val: 27
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Exportar en forma rapida GridView a excel

Publicado por Yenier (27 intervenciones) el 23/09/2021 18:36:00
https://www.youtube.com/watch?v=9QIAF2XiTm4&t=5s amigo en mi canal tengo este video, en la descripcion del mismo esta el codigo para que lo descargues! cualquier duda que tengas me contactas a mi correo: [email protected] ó a mi whatsapp +506 89499901
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exportar en forma rapida GridView a excel

Publicado por Marco (21 intervenciones) el 26/09/2021 03:54:09
Amigo buenas noches , la exportacion que detallas es perfecto para exportar 100 o 300 registros pero cuando es de 3000 a más el método que expones es demasiado lento peor aún cuando son 10000 registros aunque la intención es buena y está bien explicado para un caso real no sirve ese método .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar