Visual Basic.NET - Fallo al guardar DataSet en Excel

 
Vista:
sin imagen de perfil
Val: 229
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Fallo al guardar DataSet en Excel

Publicado por José Vicente (113 intervenciones) el 23/09/2021 13:26:04
Hola, con el código:
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
Private Sub actualiza_btn_Click(sender As Object, e As EventArgs) Handles actualiza_btn.Click
 
        Dim anio As String = CStr(Now.Year)
 
        exApp = New Excel.Application
        exLibro = exApp.Workbooks.Open("C:\Users\joviz\Downloads\Historico_tension.xlsx")
        exHoja = DirectCast(exLibro.Sheets("Histórico tensión " & anio), Excel.Worksheet)
        exHoja.Select()
 
        Dim ultimaFila As Int16 = exHoja.Range("A1").End(Excel.XlDirection.xlDown).Row
        Dim menorFecha As String = Format(exHoja.Range("$A$" & ultimaFila).Value, "dd/MM/yyy")
        Dim rowIndex As Int16 = 0
 
        'AVERIGUAMOS LA FILA DEL DGV DONDE ESTÁ LA ÚLTIMA FECHA GUARDADA EN LA HOJA EXCEL
 
        For Each row As DataGridViewRow In DataGridView1.Rows
 
            'SI LA FECHA DE LA COLUMNA COINCIDE CON LA FECHA BUSCADA
 
            If CStr(row.Cells(0).Value) = menorFecha Then
 
                'GUARDAMOS EL ÍNDICE DE LA FILA Y SALIMOS DEL FOR
 
                rowIndex = row.Index
 
                Exit For
 
            End If
 
        Next
 
        Dim valorBuscado As Int16 = rowIndex + 1
 
        Try
 
            If ((DataGridView1.Columns.Count = 0) Or (DataGridView1.Rows.Count = 0)) Then
 
                Exit Sub
 
            End If
 
            'CREAMOS DATASET PARA EXPORTAR
 
            Dim dset As New DataSet
 
            'AGREGAMOS LA TABLA AL DATASET
 
            dset.Tables.Add()
 
            'AGREGAMOS COLUMNAS A LA TABLA
 
            For i As Integer = 0 To DataGridView1.ColumnCount - 1
 
                dset.Tables(0).Columns.Add(DataGridView1.Columns(i).HeaderText)
 
            Next
 
            'AGREGAMOS FILAS A LA TABLA
 
            Dim dr1 As DataRow
 
            For i As Integer = valorBuscado To DataGridView1.RowCount - 1
 
                dr1 = dset.Tables(0).NewRow
 
                For j As Integer = 0 To DataGridView1.Columns.Count - 1
 
                    dr1(j) = DataGridView1.Rows(i).Cells(j).Value
 
                Next
 
                dset.Tables(0).Rows.Add(dr1)
 
            Next
 
            Dim dt As System.Data.DataTable = dset.Tables(0)
            Dim dc As System.Data.DataColumn
            Dim dr As System.Data.DataRow
            Dim contadorColumna As Int16 = 0
            Dim contadorFila As Int16 = 0
 
            For Each dc In dt.Columns
 
                contadorColumna += 1
                exApp.Cells(1, contadorColumna) = dc.ColumnName
 
            Next
 
            For Each dr In dt.Rows
 
                contadorFila += 1
                contadorColumna = 0
 
                For Each dc In dt.Columns
 
                    contadorColumna += 1
                    exApp.Cells(valorBuscado + 1, contadorColumna) = dr(dc.ColumnName)
 
                Next
 
            Next
 
            'CONFIGURAMOS LA ORIENTACIÓN DE LA HOJA Y EL TAMAÑO
 
            exHoja.PageSetup.PrintTitleRows = exHoja.Rows(1).Address 'PONEMOS LA FILA DE ENCABEZADO EN TODAS LAS HOJAS IMPRESAS
            exHoja.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4 'TAMAÑO DE PAPEL A4
            exHoja.Name = "Histórico tensión " & anio
            exHoja.Rows.Item(1).Font.Bold = 1 'NEGRITA
            exHoja.Rows.Item(1).Font.ColorIndex = 49 'COLOR DEL ENCABEZADO
            exHoja.Rows.Item(1).HorizontalAlignment = 3 'ALINEADO DEL ENCABEZADO
            exHoja.Range("E1").End(Excel.XlDirection.xlDown).Select()
 
            Dim nombreFichero As String = "C:\Users\joviz\Downloads\Historico_tension.xlsx"
            Dim blnFileOpen As Boolean = False
 
            Try
 
                Dim fileTemp As System.IO.FileStream = System.IO.File.OpenWrite(nombreFichero)
 
                fileTemp.Close()
 
            Catch ex As Exception
 
                blnFileOpen = False
 
            End Try
 
            MessageBox.Show("EL DOCUMENTO FUE ACTUALIZADO CORRECTAMENTE.", "MENSAJE", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
 
            exLibro.Save()
            exApp.Workbooks.Open(nombreFichero)
            exApp.Visible = True
 
        Catch ex As Exception
 
            MessageBox.Show(ex.Message, "DATOS DE TENSIÓN ARTERIAL DEL AÑO " & anio, MessageBoxButtons.OK, MessageBoxIcon.Error)
 
        End Try
 
        ' LIMPIAMOS TODOS LOS PROCESOS DE EXCEL ABIERTOS DE LA MEMORIA
 
        Dim P As System.Diagnostics.Process
 
        Try
 
            For Each P In System.Diagnostics.Process.GetProcesses
 
                If P.ProcessName.ToUpper Like "*EXCEL*" Then
 
                    P.Kill()
 
                End If
 
            Next
 
        Catch
 
        End Try
 
        GC.WaitForPendingFinalizers()
        GC.Collect()
 
        conexion.Close()
 
    End Sub
Intento añadir el DataSet a la hoja Excel que ya tengo generada, y lo que consigo es que borre la última fila de la hoja y no añada ningún registro. ¿Como lo puedo arreglar? ¿Qué tengo mal?. 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
sin imagen de perfil
Val: 229
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Fallo al guardar DataSet en Excel

Publicado por José Vicente (113 intervenciones) el 24/09/2021 12:07:15
Hola, he conseguido que escriba el dataset en la hoja Excel, lo que pasa es que en vez de añadir al final los valores, machaca las primeras filas, he intentado arreglarlo cambiando los índices en el for de llenado pero sigue sin hacerlo bien. ¿Puede alguien echarme un cable?
Mi código es:
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
Private Sub actualiza_btn_Click(sender As Object, e As EventArgs) Handles actualiza_btn.Click
 
        Dim anio As String = CStr(Now.Year)
 
        exApp = New Excel.Application
        exLibro = exApp.Workbooks.Open("C:\Users\joviz\Downloads\Historico_tension.xlsx")
        exHoja = DirectCast(exLibro.Sheets("Histórico tensión " & anio), Excel.Worksheet)
 
        Dim ultimaFila As Int16 = exHoja.Range("A1").End(Excel.XlDirection.xlDown).Row
        Dim menorFecha As String = Format(exHoja.Range("$A$" & ultimaFila).Value, "dd/MM/yyy")
        Dim rowIndex As Int16 = 0
        Dim primeraVacia As String = ("A" & ultimaFila + 1)
 
        'SELECCIONO LA PRIMERA CELDA VACÍA DESPUÉS DE LA ÚLTIMA FILA ESCRITA
 
        exHoja.Range(primeraVacia).Select()
 
        Dim actualizaSQL As String = "SELECT * FROM valores WHERE fecha > '" & menorFecha & "';"
 
        'ESTABLECEMOS CONEXIÓN CON POSTGRES
 
        If conexion.State = ConnectionState.Open Then
            conexion.Close()
 
        Else conexion.Open()
 
        End If
 
        Dim SQLadapter As New NpgsqlDataAdapter(actualizaSQL, conexion)
        Dim ds As New DataSet
 
        'RELLENAMOS EL DATASET
 
        SQLadapter.Fill(ds)
 
        For i = 0 To ds.Tables(0).Rows.Count - 1
 
            For j = 0 To ds.Tables(0).Columns.Count - 1
 
                exHoja.Cells(i + 1, j + 1) = ds.Tables(0).Rows(i).Item(j) 'RELLENAMOS LAS CELDAS CON LOS NUEVOS VALORES
 
            Next
 
        Next
 
        'GUARDAMOS Y CERRAMOS EL EXCEL
 
        exLibro.SaveAs("C:\Users\joviz\Downloads\Historico_tension.xlsx")
        exLibro.Close()
        exApp.Quit()
 
        conexion.Close()
 
        ' LIMPIAMOS TODOS LOS PROCESOS DE EXCEL ABIERTOS DE LA MEMORIA
 
        Dim P As System.Diagnostics.Process
 
        Try
 
            For Each P In System.Diagnostics.Process.GetProcesses
 
                If P.ProcessName.ToUpper Like "*EXCEL*" Then
 
                    P.Kill()
 
                End If
 
            Next
 
        Catch
 
        End Try
 
        GC.WaitForPendingFinalizers()
        GC.Collect()
 
        conexion.Close()
 
    End Sub
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

Fallo al guardar DataSet en Excel

Publicado por Giancarlo (488 intervenciones) el 24/09/2021 16:49:09
hola jose, si tratas de guardar mucha información puedes usar una api llamado closedxml es rápido y solo necesitas un par de dll y el openxml para usarlo en otras pc, no necesitas 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
sin imagen de perfil
Val: 229
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Fallo al guardar DataSet en Excel

Publicado por José Vicente (113 intervenciones) el 24/09/2021 17:04:05
Hola, gracias por tu comentario pero ya he solucionado el problema, ya actualizo la hoja Excel.
Dejo aquí mi código por si alguien lo necesita.
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
Dim anio As String = CStr(Now.Year) 'EXTRAEMOS EL AÑO DE LA FECHA ACTUAL
 
        exApp = New Excel.Application
        exLibro = exApp.Workbooks.Open("D:\Documentos\Escaneados\Informe_medico_infarto_2019\Tensión\Historico tension.xlsx")
        exHoja = DirectCast(exLibro.Sheets("Histórico tensión " & anio), Excel.Worksheet)
 
        Dim ultimaFila As Int16 = exHoja.Range("A1").End(Excel.XlDirection.xlDown).Row 'VALOR DE LA ÚLTIMA FILA CON DATOS
        Dim menorFecha As String = Format(exHoja.Range("$A$" & ultimaFila).Value, "dd/MM/yyy") 'VALOR DE LA ÚLTIMA FECHA INSERTADA EN LA HOJA
        Dim rowIndex As Int16 = 0
        Dim primeraVacia As String = ("A" & ultimaFila + 1) 'PRIMERA FILA VACÍA
 
        'SELECCIONO LA PRIMERA CELDA VACÍA DESPUÉS DE LA ÚLTIMA FILA ESCRITA
 
        exHoja.Select()
        exHoja.Range(primeraVacia).Select()
 
        Dim actualizaSQL As String = "SELECT * FROM valores WHERE fecha > '" & menorFecha & "';"
 
        'ESTABLECEMOS CONEXIÓN CON POSTGRES
 
        If conexion.State = ConnectionState.Open Then
            conexion.Close()
 
        Else conexion.Open()
 
        End If
 
        Dim SQLadapter As New NpgsqlDataAdapter(actualizaSQL, conexion)
        Dim ds As New DataSet
 
        'RELLENAMOS EL DATASET Y AÑADIMOS REGISTROS AL EXCEL
 
        SQLadapter.Fill(ds)
 
        For i = 0 To ds.Tables(0).Rows.Count - 1 'RECORREMOS LAS FILAS DEL DATASET
 
            For j = 0 To ds.Tables(0).Columns.Count - 1 'RECORREMOS LAS COLUMNAS DEL DATASET
 
                exHoja.Cells(ultimaFila + 1, j + 1) = ds.Tables(0).Rows(i).Item(j) 'RELLENAMOS LAS CELDAS CON LOS NUEVOS VALORES
 
            Next
 
            ultimaFila += 1
 
        Next
 
        'FORMATEAMOS, GUARDAMOS Y CERRAMOS EL EXCEL
 
        exHoja.Rows.Item(1).Font.Bold = 1 'NEGRITA
        exHoja.Rows.Item(1).Font.ColorIndex = 49 'COLOR DEL ENCABEZADO
        exHoja.Rows.Item(1).HorizontalAlignment = 3 'ALINEADO DEL ENCABEZADO
 
        Dim objRango As Excel.Range = exHoja.Range(exHoja.Cells(1, 1), exHoja.Range("E1").End(Excel.XlDirection.xlDown))
        Dim contador As Integer = exHoja.Rows.Count
 
        objRango.Borders.LineStyle = 1 'BORDES DE LA HOJA
        objRango.HorizontalAlignment = 3 'ALINEADO DE LAS COLUMNAS
 
        exHoja.Rows.Font.Size = 12 ' TAMAÑO DE LA FUENTE
        exHoja.Rows.Font.Name = "Adobe Garamond Pro Bold" 'TIPO DE FUENTE
 
        exHoja.Columns.AutoFit() 'AJUSTE DE LAS COLUMNAS
 
        exHoja.Range("A2:A367").Font.ColorIndex = 5 'COLOR DE LA FUENTE DE LA COLUMNA DE FECHAS
        exHoja.Range("A2:A367").Interior.Color = Color.White 'COLOR DEL FONDO DE LA COLUMNA FECHAS
        exHoja.Range("A2:A367").NumberFormat = "dd/mm/yyyy"
 
 
        'DAMOS FORMATO CONDICIONAL DE LAS CELDAS
        'FORMATO A COLUMNA DE FECHA
 
        Dim NCol As Integer = DataGridView1.ColumnCount
        Dim NRow As Integer = DataGridView1.RowCount
 
        For Fila As Integer = 2 To NRow + 1
 
            For Col As Integer = 2 To NCol
 
                Dim FC As String = Chr(64 + Col) & Fila
 
                exHoja.Range(FC).Select()
                exHoja.Range(FC).Font.ColorIndex = 1
                exHoja.Range(FC).Font.Bold = True
 
            Next
 
        Next
 
        'FORMATO A COLUMNA SISTÓLICA
 
        For Fila As Integer = 2 To NRow + 1
 
            For Col As Integer = 2 To NCol - 3
 
                Dim FC As String = Chr(64 + Col) & Fila
 
                exHoja.Range(FC).Select()
 
                If exHoja.Range(FC).Value >= 15 Or exHoja.Range(FC).Value <= 11 Then
 
                    exHoja.Range(FC).Font.ColorIndex = 3
                    exHoja.Range(FC).Font.Bold = True
 
                End If
 
            Next
 
        Next
 
        'FORMATO A COLUMNA DIASTÓLICA
 
        For Fila As Integer = 2 To NRow + 1
 
            For Col As Integer = 3 To NCol - 2
 
                Dim FC As String = Chr(64 + Col) & Fila
 
                exHoja.Range(FC).Select()
 
                If exHoja.Range(FC).Value <= 5 Or exHoja.Range(FC).Value >= 8 Then
 
                    exHoja.Range(FC).Font.ColorIndex = 3
                    exHoja.Range(FC).Font.Bold = True
 
                End If
 
            Next
 
        Next
 
        'FORMATO A COLUMNA PULSACIONES
 
        For Fila As Integer = 2 To NRow + 1
 
            For Col As Integer = 4 To NCol - 1
 
                Dim FC As String = Chr(64 + Col) & Fila
 
                exHoja.Range(FC).Select()
 
                If exHoja.Range(FC).Value <= 59 Or exHoja.Range(FC).Value >= 80 Then
 
                    exHoja.Range(FC).Font.ColorIndex = 3
                    exHoja.Range(FC).Font.Bold = True
 
                End If
 
            Next
 
        Next
 
        'FORMATO A COLUMNA SATURACIÓN
 
        For Fila As Integer = 2 To NRow + 1
 
            For Col As Integer = 5 To NCol
 
                Dim FC As String = Chr(64 + Col) & Fila
 
                exHoja.Range(FC).Select()
 
                If exHoja.Range(FC).Value <= 90 Then
 
                    exHoja.Range(FC).Font.ColorIndex = 3
                    exHoja.Range(FC).Font.Bold = True
 
                End If
 
            Next
 
        Next
 
        exHoja.Range("E1").End(Excel.XlDirection.xlDown).Select()
 
        'ESCRIBIMOS LAS MEDIAS DE CADA COLUMNA
 
        Dim lastRow As Long
 
        lastRow = exHoja.Range("A370").End(Excel.XlDirection.xlUp).Row
        lastRow += 2
 
        exHoja.Cells(lastRow, 1).Select()
        exHoja.Cells(lastRow, 1).Value = "MEDIAS: "
        exHoja.Cells(lastRow, 1).Font.ColorIndex = 32
        exHoja.Cells(lastRow, 1).Interior.Color = Color.Chartreuse
        exHoja.Cells(lastRow, 1).HorizontalAlignment = 3
        exHoja.Cells(lastRow, 2).FormulaLocal = "=REDONDEAR(PROMEDIO(B2:B" & lastRow - 2 & ");2)"
        exHoja.Cells(lastRow, 2).HorizontalAlignment = 3
        exHoja.Cells(lastRow, 3).FormulaLocal = "=REDONDEAR(PROMEDIO(C2:C" & lastRow - 2 & ");2)"
        exHoja.Cells(lastRow, 3).HorizontalAlignment = 3
        exHoja.Cells(lastRow, 4).FormulaLocal = "=REDONDEAR(PROMEDIO(D2:D" & lastRow - 2 & ");0)"
        exHoja.Cells(lastRow, 4).HorizontalAlignment = 3
        exHoja.Cells(lastRow, 5).FormulaLocal = "=REDONDEAR(PROMEDIO(E2:E" & lastRow - 2 & ");0)"
        exHoja.Cells(lastRow, 5).HorizontalAlignment = 3
 
        exHoja.Range("E1").End(Excel.XlDirection.xlDown).Select()
 
        exLibro.SaveAs("D:\Documentos\Escaneados\Informe_medico_infarto_2019\Tensión\Historico tension.xlsx")
        exLibro.Close()
        exApp.Quit()
 
        conexion.Close()
 
        ' LIMPIAMOS TODOS LOS PROCESOS DE EXCEL ABIERTOS DE LA MEMORIA
 
        Dim P As System.Diagnostics.Process
 
        Try
 
            For Each P In System.Diagnostics.Process.GetProcesses
 
                If P.ProcessName.ToUpper Like "*EXCEL*" Then
 
                    P.Kill()
 
                End If
 
            Next
 
        Catch
 
        End Try
 
        GC.WaitForPendingFinalizers()
        GC.Collect()
 
        conexion.Close()
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