Exportar treegridview a Excel
Publicado por Juan Enrique (14 intervenciones) el 05/09/2018 00:39:18
ultimamente he estado realizando pruebas y usado mucho los treegridview y una de las dudas que tuve y resolvi fueron la de insertar imagenes en las celdas, combobox, fechas, etc, como modificar una celda de una columna como cambiar la imagen sin afectar toda la columna, como colorear ciertas celdas que tengan un valor especifico, etc... Ahora lo que dice el titulo una de las cosas mas interesantes es el poder Exportar tu consulta o resultado a un excel... el siguiente codigo resuelve la exportación
la primer parte es la siguiente
'de esta forma su consulta se realizara y se abrira en un excel al finalizar, algunos datos son para ocultar o mostrar columnas ya que este codigo solo funciona para todo lo que este visible en ese momento en el treegridview, en otras palabras si quisieras mostrar los nodos hijos, tendrias primero que expandir los nodos padres de cada hijo, o en caso facil manualmente expandir los nodos que necesites visualizar... si les sirve espero y lo usen ahora que si tienen una forma mas rapida de exportar los datos les agradeceria que pasaran el codigo, si tienen alguna duda sobre alguna de las cosas que comente arriba con gusto les comento como le hice, un ejemplo es el poder utilizar las celdas por separado esto es por ejemplo el tener combobox en una columna de los nodos padre y en la hijos de la misma columna tener un textbox o un imagebox etc, se podria decir tratar las celdas independientes unas de otras, aun estoy aprendiendo pero si lo poco que se les sirve que mejor que compartirles así nos ayudamos. saludos y hasta la proxima espero mi aporte les sirva
la primer parte es la siguiente
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
Try
treeGridView1.Columns("Column8").Visible = True
treeGridView1.Columns("CIERTOFALSO").Visible = False
treeGridView1.Columns("Column21").Visible = False
'Column21
Me.Cursor = Cursors.WaitCursor
RBtnEspecialidades.Enabled = False
RBtnPartidas.Enabled = False
RBtnSubcontratos.Enabled = False
RBtNTODO.Enabled = False
'Intentar generar el documento.
'Se adjunta un texto debajo del encabezado con la fecha actual del sistema.
ExportarDatosExcel(treeGridView1, "FECHA: " + Now.Date())
'System.Drawing.Image.FromFile("C:\Users\juan.ayala\Desktop\tache.ico")
Me.Cursor = Cursors.Default
RBtnEspecialidades.Enabled = True
RBtnPartidas.Enabled = True
RBtnSubcontratos.Enabled = True
RBtNTODO.Enabled = True
treeGridView1.Columns("Column8").Visible = False
treeGridView1.Columns("CIERTOFALSO").Visible = True
treeGridView1.Columns("Column21").Visible = True
Catch ex As Exception
'Si el intento es fallido, mostrar MsgBox.
MessageBox.Show("No se puede generar el documento Excel.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
'seguido del que se encarga de cargar los datos y leerlos
Public Sub ExportarDatosExcel(ByVal treeGridView1 As DataGridView, ByVal titulo As String)
Dim m_Excel As New Excel.Application
m_Excel.Cursor = Excel.XlMousePointer.xlWait
'La linea de abajo hace que el archivo que se este llenando no se muestre, ya que si el usuario da click en ese momento se cancela la exportacion a excel
' de esta manera de evita y una vez lleno al finalizar el codigo se pone el visible = true para mostrar el excel lleno y evitar errores
m_Excel.Visible = False
Dim objLibroExcel As Excel.Workbook = m_Excel.Workbooks.Add
'Dim objLibroExcel As Excel.Workbook
'bjLibroExcel = m_Excel.Workbooks.Open(".xlsb")
Dim objHojaExcel As Excel.Worksheet = objLibroExcel.Worksheets(1)
With objHojaExcel
.Visible = Excel.XlSheetVisibility.xlSheetVisible
.Activate()
'Encabezado
.Range("A1:L1").Merge()
.Range("A1:L1").Value = "PROGRAMA DE CONTRATACIONES"
'.Range("A1:L1").Value = System.Drawing.Image.FromFile("C:\Users\juan.ayala\Desktop\SINDY 05-07-2018\SINDY\SINDY\Resources\Logo Nuevo 3.jpg")
'ActiveSheet.Pictures.Insert("C:\grafico.png")
.Range("A1:L1").Font.Bold = True
.Range("A1:L1").Font.Size = 15
'Copete
.Range("A2:L2").Merge()
.Range("A2:L2").Value = titulo
.Range("A2:L2").Font.Bold = True
.Range("A2:L2").Font.Size = 12
Const primeraLetra As Char = "A"
Const primerNumero As Short = 3
Dim Letra As Char, UltimaLetra As Char
Dim Numero As Integer, UltimoNumero As Integer
Dim cod_letra As Byte = Asc(primeraLetra) - 1
Dim sepDec As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
Dim sepMil As String = Application.CurrentCulture.NumberFormat.NumberGroupSeparator
'Establecer formatos de las columnas de la hija de cálculo
Dim strColumna As String = ""
Dim LetraIzq As String = ""
Dim cod_LetraIzq As Byte = Asc(primeraLetra) - 1
Letra = primeraLetra
Numero = primerNumero
Dim objCelda As Excel.Range
For Each c As DataGridViewColumn In treeGridView1.Columns
If c.Visible Then
If Letra = "Z" Then
Letra = primeraLetra
cod_letra = Asc(primeraLetra)
cod_LetraIzq += 1
LetraIzq = Chr(cod_LetraIzq)
Else
cod_letra += 1
Letra = Chr(cod_letra)
End If
strColumna = LetraIzq + Letra + Numero.ToString
objCelda = .Range(strColumna, Type.Missing)
objCelda.Value = c.HeaderText
objCelda.EntireColumn.Font.Size = 8
'objCelda.EntireColumn.NumberFormat = c.DefaultCellStyle.Format
If c.ValueType Is GetType(Decimal) OrElse c.ValueType Is GetType(Double) Then
objCelda.EntireColumn.NumberFormat = "#" + sepMil + "0" + sepDec + "00"
End If
End If
Next
Dim objRangoEncab As Excel.Range = .Range(primeraLetra + Numero.ToString, LetraIzq + Letra + Numero.ToString)
objRangoEncab.BorderAround(1, Excel.XlBorderWeight.xlMedium)
UltimaLetra = Letra
Dim UltimaLetraIzq As String = LetraIzq
'CARGA DE DATOS
Dim i As Integer = Numero + 1
For Each reg As DataGridViewRow In treeGridView1.Rows
Dim _x As Object = reg
LetraIzq = ""
cod_LetraIzq = Asc(primeraLetra) - 1
Letra = primeraLetra
cod_letra = Asc(primeraLetra) - 1
For Each c As DataGridViewColumn In treeGridView1.Columns
Dim _y As Object = c
If c.Visible Then
If Letra = "Z" Then
Letra = primeraLetra
cod_letra = Asc(primeraLetra)
cod_LetraIzq += 1
LetraIzq = Chr(cod_LetraIzq)
Else
cod_letra += 1
Letra = Chr(cod_letra)
End If
strColumna = LetraIzq + Letra
' acá debería realizarse la carga
Try
.Cells(i, strColumna) = IIf(IsDBNull(reg.ToString), "", reg.Cells(c.Index).Value)
'.Cells(i, strColumna) = IIf(IsDBNull(reg.(c.DataPropertyName)), c.DefaultCellStyle.NullValue, reg(c.DataPropertyName))
'.Range(strColumna + i, strColumna + i).In()
Catch ex As Exception
End Try
End If
Next
Dim objRangoReg As Excel.Range = .Range(primeraLetra + i.ToString, strColumna + i.ToString)
objRangoReg.Rows.BorderAround()
objRangoReg.Select()
i += 1
Next
UltimoNumero = i
'Dibujar las líneas de las columnas
LetraIzq = ""
cod_LetraIzq = Asc("A")
cod_letra = Asc(primeraLetra)
Letra = primeraLetra
For Each c As DataGridViewColumn In treeGridView1.Columns
If c.Visible Then
objCelda = .Range(LetraIzq + Letra + primerNumero.ToString, LetraIzq + Letra + (UltimoNumero - 1).ToString)
objCelda.BorderAround()
If Letra = "Z" Then
Letra = primeraLetra
cod_letra = Asc(primeraLetra)
LetraIzq = Chr(cod_LetraIzq)
cod_LetraIzq += 1
Else
cod_letra += 1
Letra = Chr(cod_letra)
End If
End If
Next
'Dibujar el border exterior grueso
Dim objRango As Excel.Range = .Range(primeraLetra + primerNumero.ToString, UltimaLetraIzq + UltimaLetra + (UltimoNumero - 1).ToString)
objRango.Select()
objRango.Columns.AutoFit()
objRango.Columns.BorderAround(1, Excel.XlBorderWeight.xlMedium)
End With
m_Excel.Cursor = Excel.XlMousePointer.xlDefault
m_Excel.Visible = True
End Sub
'de esta forma su consulta se realizara y se abrira en un excel al finalizar, algunos datos son para ocultar o mostrar columnas ya que este codigo solo funciona para todo lo que este visible en ese momento en el treegridview, en otras palabras si quisieras mostrar los nodos hijos, tendrias primero que expandir los nodos padres de cada hijo, o en caso facil manualmente expandir los nodos que necesites visualizar... si les sirve espero y lo usen ahora que si tienen una forma mas rapida de exportar los datos les agradeceria que pasaran el codigo, si tienen alguna duda sobre alguna de las cosas que comente arriba con gusto les comento como le hice, un ejemplo es el poder utilizar las celdas por separado esto es por ejemplo el tener combobox en una columna de los nodos padre y en la hijos de la misma columna tener un textbox o un imagebox etc, se podria decir tratar las celdas independientes unas de otras, aun estoy aprendiendo pero si lo poco que se les sirve que mejor que compartirles así nos ayudamos. saludos y hasta la proxima espero mi aporte les sirva
Valora esta pregunta


0