Error al exportar un datagridview a excel

Cuando exporto el datagridview a excel me lo exporta normal la primera vez

Si exporto por segunda vez, lo ke sucede es que se pone lenta mi maquina como si
estuviera cargando algo. Y cuando me fijo en el administrador de tareas aparecen varios procesos de excel, aun despues de haber cerrado todos los archivos excel.
Este es mi codigo que uso para dar formato y exportar a un excel el datagridview, espero
me puedan aconsejar, y ayudar a resolver mi problema . Gracias

Dim saveFileDialog1 As New SaveFileDialog()
 saveFileDialog1.Filter = "Excel (*.xls)|*.xls"
 saveFileDialog1.Title = "excel File"
 saveFileDialog1.ShowDialog()
 If Not (Directory.Exists(saveFileDialog1.FileName)) Then
 Directory.Exists(saveFileDialog1.FileName)
 End If
 Dim m_Excel As New Excel.Application
 m_Excel.Cursor = Excel.XlMousePointer.xlWait
 Dim objLibroExcel As Excel.Workbook = m_Excel.Workbooks.Add
 Dim objHojaExcel As Microsoft.Office.Interop.Excel.Worksheet = objLibroExcel.Worksheets(1)
 With objHojaExcel
 .Visible = Microsoft.Office.Interop.Excel.XlSheetVisibility.xlSheetVisible
 .Activate()
 ''Encabezado
 .Range("C2:E2").Merge()
 .Range("C2:E2").Font.Name = "Calibri"
 ' .Range("C2:E2").Font.ThemeColor = Color.Aqua
 .Range("C2:E2").Value = "REPORTE DE EXCEL"
 '.Range("C2:E2").Font.Bold = True
 .Range("C2:E2").Font.Size = 15
 .Range("C2:E2").Font.Underline = Excel.XlUnderlineStyle.xlUnderlineStyleSingle
 '.Range("C2:E2").Font.ThemeColor = Excel.XlThemeColor.xlThemeColorAccent3
 .Range("C2:E2").Font.ThemeFont = Excel.XlThemeFont.xlThemeFontMajor
 .Range("C2:E2").Font.Strikethrough = False
 .Range("C2:E2").Font.Superscript = False
 .Range("C2:E2").Font.Subscript = False
 .Range("C2:E2").Font.OutlineFont = False
 .Range("C2:E2").Font.Shadow = False
 .Range("C2:E2").Font.Bold = True
 .Range("C2:E2").HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter
 .Range("C2:E2").Font.ColorIndex = 1
 .Range("C2:E2").Interior.ThemeColor = Excel.XlThemeColor.xlThemeColorAccent1
 Dim objRangoTitulo As Microsoft.Office.Interop.Excel.Range = .Range("C2", "E2")
 objRangoTitulo.Rows.BorderAround()
 ' objRangoTitulo.Font.Background = Color.Aqua
 objRangoTitulo.Columns.BorderAround(1, Microsoft.Office.Interop.Excel.XlBorderWeight.xlMedium)
 objRangoTitulo.Select()
 .Range("C3").Value = "Codigo" : .Range("D3").Value = "Descripcion" : .Range("E3").Value = "Operacion"
 .Range("C3").Merge() : .Range("D3").Merge() : .Range("E3").Merge()
 .Range("C3:E3").Font.Name = "Calibri"
 .Range("C3:E3").Font.Size = 12
 .Range("C3:E3").Font.ColorIndex = 2
 .Range("C3:E3").Interior.ColorIndex = 15
 .Range("C3:E3").HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter
 objRangoTitulo = .Range("C3", "E3")
 objRangoTitulo.Rows.BorderAround()
ObjRangoTitulo. Columns. BorderAround(1, Microsoft. Office. Interop. Excel. XlBorderWeight. XlMedium)
 Const primeraLetra As Char = "C"
 Const primerNumero As Short = 4
 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 Microsoft.Office.Interop.Excel.Range
 For Each c As DataGridViewColumn In DataGridView1.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
 End If
 Next
 Dim objRangoEncab As Microsoft.Office.Interop.Excel.Range = .Range(primeraLetra + Numero.ToString, LetraIzq + Letra + Numero.ToString)
 objRangoEncab.BorderAround(1, Microsoft.Office.Interop.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 DataGridView1.Rows
 LetraIzq = ""
 cod_LetraIzq = Asc(primeraLetra) - 1
 Letra = primeraLetra
 cod_letra = Asc(primeraLetra) - 1
 For Each c As DataGridViewColumn In DataGridView1.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
 ' acá debería realizarse la carga 
 .Cells(i, Trim(strColumna)) = IIf(IsDBNull(Trim(reg. ToString)), "", Trim(reg. Cells(c. Index). Value))
 End If
 Next
 Dim objRangoReg As Microsoft.Office.Interop.Excel.Range = .Range(primeraLetra + Trim(i.ToString), strColumna + Trim(i.ToString))
 objRangoReg.Rows.BorderAround()
 objRangoReg.Select()
 i += 1
 Next
 UltimoNumero = i
 'Dibujar las líneas de las columnas 
 LetraIzq = ""
 cod_LetraIzq = Asc("C")
 cod_letra = Asc(primeraLetra)
 Letra = primeraLetra
 For Each c As DataGridViewColumn In DataGridView1.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 Microsoft.Office.Interop.Excel.Range = .Range("C" + primerNumero.ToString, UltimaLetraIzq + "E" + (UltimoNumero - 1).ToString)
 objRango.Select()
 objRango.Columns.AutoFit()
 objRango.Columns.BorderAround(1, Microsoft.Office.Interop.Excel.XlBorderWeight.xlMedium)
 End With
 'esta siguiente linea comentada
 'Reemplaza automaticamente el archivo
 If Not (File.Exists(saveFileDialog1.FileName)) Then
 m_Excel.ActiveWorkbook.SaveAs(saveFileDialog1.FileName)
 'Filename:="D:\Analisis de compra\" + text + ".xlsx")
 Else
 File.Delete(saveFileDialog1.FileName)
 m_Excel.ActiveWorkbook.SaveAs(saveFileDialog1.FileName)
 End If
 m_Excel.ActiveWorkbook.Close(SaveChanges:=False)
 'Cierra el archivo y elimina la variable
 m_Excel.Quit()
 m_Excel = Nothing
 objLibroExcel = Nothing
Process. Start(saveFileDialog1. FileName)

1 respuesta

Respuesta
1

Utiliza un Using, no recuerdo si esto existe en VB.net seria algo como :

Using m_Excel As New Excel.Application

end using

O también podrías llamar al garbage collector para que elimine ese objeto de excel.

Es común que esto pase con aplicaciones COM como lo es excel, pero si aplicas lo ed arriba seguro te ayudara.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas