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 programacion.vera@gmail.com (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 Hugo Correa

Exportar en forma rapida GridView a excel

Publicado por Hugo Correa (72 intervenciones) el 19/11/2015 23:24:12
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 Wilfredo Patricio Castillo

Exportar en forma rapida GridView a excel

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

Exportar en forma rapida GridView a excel

Publicado por markho markho34@hotmail.com (17 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

Exportar en forma rapida GridView a excel

Publicado por markho markho34@hotmail.com (17 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

Exportar en forma rapida GridView a excel

Publicado por markho34 markho34@hotmail.com (17 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

Exportar en forma rapida GridView a excel

Publicado por markho34 markho34@hotmail.com (17 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

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