read office net microsoft manipular desde crear application .net vb.net excel interop

.net - office - Eliminando un proceso de solicitud de interoperabilidad



read excel file vb net (9)

Para que Excel salga, debe llamar a Application.Quit y usar una de las siguientes técnicas.

  • Llame a Marshal.ReleaseComObject en cada objeto de Excel que instancia. Hay un artículo de KnowledgeBase que describe cómo hacerlo. Por ejemplo, en el código de muestra "eApp.Workbooks.Open" crea una instancia de un objeto Workbooks sin asignarle una variable. Debe asignar una variable como se describe en el artículo de KB para que pueda liberarla posteriormente. El problema es que con todo menos los escenarios de automatización más sencillos es muy difícil asegurarse de que siempre libere todos esos objetos en todas las rutas de código (por ejemplo, utilizando try / finally para garantizar que se liberen cuando se lanza una excepción).

  • Llame a GC.Collect y GC.WaitForPendingFinalizers después de liberar el último objeto de Excel. Algunas personas han sugerido que puede necesitar hacer esto dos veces.

Tengo lo siguiente en un programa (escrito en VB.NET):

Imports Microsoft.Office.Interop.Excel Public Class Form1 Dim eApp As New Excel.Application Dim w As Excel.Workbook w = eApp.Workbooks.Open( "path.xls", ReadOnly:=True) .. Processing Code .. //Attempts at killing the excel application w.Close() eApp.Workbooks.Close() eApp.Quit() End Class

Cuando ejecuto esto un par de veces, obtengo un montón de instancias EXCEL.EXE en mi administrador de tareas. ¿Cómo puedo matar estos procesos en código? Todos los que están en el código han sido probados y no funcionaron.


Tuve que hacer esto hace un tiempo en NET 1.1, así que perdona el óxido.

En la aplicación electrónica, había un Hwind (un manejador de ventana win32 - http://msdn.microsoft.com/en-us/library/bb255823.aspx ) u objeto similar. Tuve que usar eso y un pInvoke ( http://www.pinvoke.net/default.aspx/user32.GetWindowThreadProcessId ) para obtener la identificación del proceso. Con eso pude hacer un Process.Kill () en el exe.

Quizás haya una mejor manera de hacerlo ahora, pero esto debería funcionar.


Use el bloque de Uso

Using eApp As New Excel.Application Using w As Excel.Workbook w = eApp.Workbooks.Open( "path.xls", ReadOnly:=True) .. Processing Code .. //Attempts at killing the excel application w.Close() eApp.Workbooks.Close() eApp.Quit() End Using End Using

Similar a try / finally block con una disposición final, esto eliminará automáticamente Excel.Application y Excel.Workbook.

Como se menciona en otra publicación, System.Runtime.InteropServices.Marshal.ReleaseComObject (eApp) también podría ser necesario ????


recorra la línea de código siguiente hasta que el resultado sea cero o menos

System.Runtime.InteropServices.Marshal.ReleaseComObject(eApp)

o mira este enlace


Después de ExcelApplication.Quit () agregue el siguiente código.

Matará a la aplicación Excel del proceso.

Process[] Proc = Process.GetProcessesByName("Excel"); foreach (Process p in Proc) { if (p.MainWindowTitle == "") p.Kill(); }


Inicie Excel:

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Workbook wb = xlApp.Workbooks.Open(...); Worksheet ws = (Worksheet)wb.Worksheets[1];

Kill Excel:

System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); wb = null; ws = null; uint idProcess; GetWindowThreadProcessId((IntPtr)xlApp.Hwnd, out idProcess); xlApp.DisplayAlerts = false; xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlApp = null; xlApp = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); Process processo = null; try { processo = Process.GetProcessById((int)idProcess); } catch { } if (processo != null) processo.Kill();


La solución de Tagore Peethala es directa y funciona. Básicamente, asegúrese de WorkBook.CLOSE ... luego ExcelApplication.QUIT ... luego busque una instancia de Excel ejecutándose sin nada abierto y ciérrela.

myExcelWorksheet = null; if (myExcelWorkbook != null) { myExcelWorkbook.Close(); myExcelWorkbook = null; } if (myExcelApp != null) { myExcelApp.Quit(); myExcelApp = null; } foreach (System.Diagnostics.Process myProcess in System.Diagnostics.Process.GetProcessesByName("Excel")) { if (myProcess.MainWindowTitle == "") { myProcess.Kill(); } }


//Quit Excel application eApp.Quit(); //Release COM objects (every object you used in eApp,like workbooks, Workbook, Sheets, Worksheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; // Force garbage collector cleaning GC.Collect();