Réf : https://stackoverflow.com/a/17367570/132599
Évitez d'utiliser des expressions à double point, comme celle-ci :
var workbook = excel.Workbooks.Open(/*params*/)
...car de cette façon, vous créez des objets RCW non seulement pour le classeur, mais aussi pour les classeurs, et vous devez les libérer aussi (ce qui n'est pas possible si une référence à l'objet n'est pas maintenue).
Cela a résolu le problème pour moi. Votre code devient :
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;
Et ensuite libérer tous ces objets :
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);
Je l'emballe dans un try {} finally {}
pour s'assurer que tout est publié, même si quelque chose ne va pas (qu'est-ce qui pourrait aller mal ?), par ex.
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);
}