Foros del Web » Programación para mayores de 30 ;) » .NET »

terminar proceso EXCEL.EXE desde vb.net

Estas en el tema de terminar proceso EXCEL.EXE desde vb.net en el foro de .NET en Foros del Web. Hola, estoy programando en vb.net y no se como cerrar el proceso de excel que se abre, dentro del código que pondré mas abajo. He ...
  #1 (permalink)  
Antiguo 09/05/2013, 06:40
 
Fecha de Ingreso: abril-2012
Mensajes: 449
Antigüedad: 12 años
Puntos: 7
terminar proceso EXCEL.EXE desde vb.net

Hola, estoy programando en vb.net y no se como cerrar el proceso de excel que se abre, dentro del código que pondré mas abajo. He intentado hacer lo que tengo en el código para cerrarlo pero muchas veces no consigo cerrarlo.

Alguien me puede ayudar?

Código vb.net:
Ver original
  1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  2.         Dim xls_cn As OleDbConnection
  3.         Dim xls_cmd As New OleDbCommand
  4.         Dim xls_reader As New OleDbDataAdapter
  5.         Dim xls_ds As New DataSet
  6.         Dim mysql_conn As New MySqlConnection
  7.         Dim mysql_comando As New MySqlCommand
  8.         Dim mysql_connstring, insert, nombreXls, fecha, factura, tTrafico, telefono, extension, cantidad, bruto, neto, facturado As String
  9.         Dim strExtension As String = ""
  10.         Dim m_Excel As Microsoft.Office.Interop.Excel.Application
  11.         Dim total, i, notificado As Integer
  12.  
  13.         If Me.servidor.Text = "" Or Me.usuario.Text = "" Or Me.password.Text = "" Or Me.bbdd.Text = "" Then
  14.             MsgBox("Completa datos de conexión")
  15.             Exit Sub
  16.         End If
  17.  
  18.         Try
  19.             If xlsx = "" Then
  20.  
  21.                 MsgBox("Selecciona un archivo.")
  22.                 Exit Sub
  23.             Else
  24.                 'obtener el nombre del archivo
  25.                 nombreXls = Path.GetFileName(xlsx)
  26.                 'obtener la extension del archivo
  27.                 strExtension = Path.GetExtension(xlsx)
  28.                 If strExtension = ".xls" Or strExtension = ".xlsx" Then
  29.                     'MsgBox("es un archivo excel")
  30.                     If (File.Exists(xlsx)) Then
  31.                         xls_cn = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsx + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'")
  32.                         m_Excel = CreateObject("Excel.Application")
  33.                         m_Excel.Workbooks.Open(xlsx)
  34.  
  35.                         Dim dt As New DataTable("Datos")
  36.  
  37.                         Using xls_cn
  38.  
  39.                             xls_cn.Open()
  40.                             xls_cmd.CommandText = "SELECT * FROM [Hoja1$]"
  41.                             xls_cmd.Connection = xls_cn
  42.                             xls_reader.SelectCommand = xls_cmd
  43.  
  44.                             'contar candidad de filas del excel
  45.                             total = m_Excel.Range("a1").CurrentRegion.Rows.Count
  46.                             'Guardamos los datos en el DataTable
  47.                             Dim da As New OleDbDataAdapter(xls_cmd)
  48.                             da.Fill(dt)
  49.  
  50.                             For i = 0 To total - 2
  51.  
  52.                                 fecha = dt.Rows(i).Item(2)
  53.                                 factura = dt.Rows(i).Item(3)
  54.                                 telefono = dt.Rows(i).Item(4).ToString
  55.                                 extension = dt.Rows(i).Item(5).ToString
  56.                                 tTrafico = dt.Rows(i).Item(6)
  57.                                 cantidad = dt.Rows(i).Item(8).ToString
  58.                                 bruto = dt.Rows(i).Item(10).ToString
  59.                                 neto = dt.Rows(i).Item(13).ToString
  60.                                 facturado = dt.Rows(i).Item(16).ToString
  61.                                 notificado = "0"
  62.  
  63.                                 '---------------------------------------------------------------------------------------------------------------------
  64.                                 'GUARDAR TODO EN SSIICONSUMOS
  65.                                 Try
  66.                                     mysql_connstring = "server=" + Me.servidor.Text + ";" _
  67.                                         & "uid=" + Me.usuario.Text + ";" _
  68.                                         & "pwd=" + Me.password.Text + ";" _
  69.                                         & "database=" + Me.bbdd.Text + ";"
  70.                                     mysql_conn.ConnectionString = mysql_connstring
  71.                                     mysql_conn.Open()
  72.                                     mysql_comando.Connection = mysql_conn
  73.                                 Catch ex As Exception
  74.                                     MsgBox("Error al realizar la conexión: " & ex.Message)
  75.                                 End Try
  76.                                 fecha = Format(CDate(fecha), "yyyy-MM-dd")
  77.                                 cantidad = Replace(cantidad, ",", ".")
  78.                                 bruto = Replace(bruto, ",", ".")
  79.                                 neto = Replace(neto, ",", ".")
  80.                                 facturado = Replace(facturado, ",", ".")
  81.                                 insert = "INSERT INTO detalle4(factura, telefono, extension, tipo_trafico, fecha, cantidad, bruto, neto, facturar, notificado) VALUES ('" & factura & "','" & telefono & "','" & extension & "','" & tTrafico & "','" & fecha & "','" & cantidad & "','" & bruto & "','" & neto & "','" & facturado & "','" & notificado & "')"
  82.                                 mysql_comando.CommandText = insert
  83.                                 Try
  84.                                     mysql_comando.ExecuteNonQuery()
  85.                                 Catch ex As Exception
  86.                                     'MsgBox("Error bbdd" & Chr(13) & Chr(13) & ex.Message)
  87.                                 End Try
  88.                                 mysql_conn.Close()
  89.                             Next
  90.                         End Using
  91.                     End If
  92.                 Else
  93.  
  94.                     MsgBox("Introduzca un archivo .xls o .xlsx .")
  95.                     Exit Sub
  96.                 End If
  97.             End If
  98.  
  99.         Catch ex As Exception
  100.             MsgBox("Error" & Chr(13) & Chr(13) & ex.Message)
  101.         End Try
  102.  
  103.         'Cerramos la conexión
  104.         xls_cn.Close()
  105.         'Eliminamos la instancia de Excel de memoria
  106.         If Not m_Excel Is Nothing Then
  107.  
  108.             nombreXls = Nothing
  109.             m_Excel.Application.Quit()
  110.             'm_Excel.Quit()
  111.             m_Excel = Nothing
  112.         End If
  113.  
  114.         MsgBox("HECHO")
  115.     End Sub
__________________
Gracias por todo;

Un saludo
  #2 (permalink)  
Antiguo 09/05/2013, 07:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: terminar proceso EXCEL.EXE desde vb.net

No tengo a mano lo que hice en su momento, pero la idea es:
Código vb:
Ver original
  1. 'cerramos el archivo Excel
  2.        If Not excel Is Nothing Then
  3.             ' Hago un bucle de eliminaciones de las referencias de cada objeto
  4.            ' que tiene relacion con el EXCEL
  5.            EiminaReferencias(excel.Sheets)
  6.             excel.Workbooks(1).Close(False)
  7.             EiminaReferencias(excel.Workbooks)
  8.             excel.Quit()
  9.             EiminaReferencias(excel.ActiveSheet)
  10.             EiminaReferencias(excel.ActiveWorkbook)
  11.             EiminaReferencias(excel.ActiveWindow)
  12.         End If
Y el llamado a cerrar:
Código vb:
Ver original
  1. Private Sub EiminaReferencias(ByRef Referencias As Object)
  2.         Try
  3.             'Bucle de eliminacion
  4.            Do Until _
  5.                  System.Runtime.InteropServices.Marshal.ReleaseComObject(Referencias) <= 0
  6.             Loop
  7.         Catch
  8.         Finally
  9.             Referencias = Nothing
  10.         End Try
  11.     End Sub

Cuando llegue a casa, me fijo cómo lo había resuelto exactamente yo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/05/2013, 08:27
 
Fecha de Ingreso: abril-2012
Mensajes: 449
Antigüedad: 12 años
Puntos: 7
Respuesta: terminar proceso EXCEL.EXE desde vb.net

Ok pues si no te importa cuando veas como lo tienes echo te importaría escribirlo?

Gracias
__________________
Gracias por todo;

Un saludo
  #4 (permalink)  
Antiguo 09/05/2013, 20:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: terminar proceso EXCEL.EXE desde vb.net

Volviendo al tema, todos los procesos de creacion de archivos Excel los terminaba con esto:
Código vb:
Ver original
  1. Try
  2.             '---------------------------------
  3.            ' Codigo que fuese
  4.            '---------------------------------
  5.            CerrarCOM(oExcel)
  6.             xlSheet = Nothing
  7.             xlBook = Nothing
  8.             oExcel = Nothing
  9.             GC.Collect()
  10.             ClearMemory()
  11.             Process.Start(oFileName)
  12.         Catch ex As OutOfMemoryException
  13.             Exit Function
  14.         Catch ex As Exception
  15.             CerrarCOM(oExcel)
  16.             xlSheet = Nothing
  17.             xlBook = Nothing
  18.             oExcel = Nothing
  19.             GC.Collect()
  20.             ClearMemory()
  21.         End Try

Dos de los métodos invocados están en el Module:

Código vb:
Ver original
  1. Friend Function CerrarCOM(ByRef oComObject As Object) As Boolean
  2.         Try
  3.             If oComObject Is Nothing = False Then
  4.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(oComObject)
  5.             End If
  6.             Return True
  7.         Catch ex As Exception
  8.             Return False
  9.         End Try
  10.     End Function
  11.  
  12.  
  13. #Region "Liberar Memoria no utilizada"
  14.     'Funcion de liberacion de memoria
  15.    Public Sub ClearMemory()
  16.         Try
  17.             Dim Mem As Process
  18.             Mem = Process.GetCurrentProcess()
  19.             SetProcessWorkingSetSize(Mem.Handle, -1, -1)
  20.         Catch ex As Exception
  21.             'Control de errores
  22.        End Try
  23.     End Sub
  24.  
  25. #End Region

Y un detalle que por allí no sabes: No puedes generar archivos de Excel si no tienes una impresora declarada (al menos hasta el VB.Net 2003), por lo que sería mejor comprobarlo antes.
Para ello, acá va una función de regalo (también iba en el Module):
Código vb:
Ver original
  1. Friend Function VerificarPrinter() As Boolean
  2.         Dim oPrint As New Printing.PrinterSettings
  3.         Try
  4.             If (oPrint.InstalledPrinters.Count = 0) Then
  5.                 MessageBox.Show("No se pueden realizar expotaciones a Excel si no existen" & vbNewLine & "impresoras definidas en esta PC.", "No se encontró impresora", MessageBoxButtons.OK, MessageBoxIcon.Error)
  6.                 Return False
  7.             End If
  8.         Catch ex As Exception
  9.             Return False
  10.         End Try
  11.         Return True
  12.     End Function

Por cierto, espero que no me preguntes qué es el "GC.Collect()"...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bd, net, proceso, terminar, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:45.