Visual Basic.NET - Exportar treegridview a Excel

 
Vista:
sin imagen de perfil
Val: 25
Ha aumentado su posición en 4 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

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


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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder