Solución:
Prueba esto:
excelBook.Close(0);
excelApp.Quit();
Al cerrar el libro de trabajo, tiene tres parámetros opcionales:
Workbook.close SaveChanges, filename, routeworkbook
Workbook.Close(false)
o si está haciendo un enlace tardío, a veces es más fácil usar cero
Workbook.Close(0)
Así es como lo he hecho al automatizar el cierre de libros de trabajo.
También fui y busqué la documentación, y la encontré aquí: Libro de Excel Cerrar
Gracias,
xlBook.Save();
xlBook.Close(true);
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
prueba esto … funcionó para mí … deberías liberar ese objeto de aplicación xl para detener el proceso.
Ref: https://stackoverflow.com/a/17367570/132599
Evite el uso de expresiones de llamada de doble punto, como esta:
var workbook = excel.Workbooks.Open(/*params*/)
… porque de esta manera crea objetos RCW no solo para el libro de trabajo, sino para los libros de trabajo, y debe liberarlo también (lo cual no es posible si no se mantiene una referencia al objeto).
Esto me resolvió el problema. Tu código se convierte en:
public Excel.Application excelApp = new Excel.Application();
public Excel.Workbooks workbooks;
public Excel.Workbook excelBook;
workbooks = excelApp.Workbooks;
excelBook = workbooks.Add(@"C:/pape.xltx");
...
Excel.Sheets sheets = excelBook.Worksheets;
Excel.Worksheet excelSheet = (Worksheet)(sheets[1]);
excelSheet.DisplayRightToLeft = true;
Range rng;
rng = excelSheet.get_Range("C2");
rng.Value2 = txtName.Text;
Y luego suelta todos esos objetos:
System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
excelBook .Save();
excelBook .Close(true);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
Envuelvo esto en un try {} finally {}
para garantizar que todo se libere incluso si algo sale mal (¿qué podría salir mal?)
public Excel.Application excelApp = null;
public Excel.Workbooks workbooks = null;
...
try
{
excelApp = new Excel.Application();
workbooks = excelApp.Workbooks;
...
}
finally
{
...
if (workbooks != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
}