Une autre solution à ce problème consiste à enregistrer le ProcessID du programme Excel dans lequel vous travaillez. Ensuite, lorsque vous avez terminé avec le programme, vous pouvez tuer spécifiquement ce processus Excel sans cibler d'autres processus Excel.
J'ai trouvé la solution dans este réponse. J'ai pensé la partager ici
Donc, tout d'abord, vous ajoutez ces lignes de code en dehors d'une méthode de classe
// The DllImport requires -- Using System.Runtime.InteropServices;
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
Après ça,
Maintenant, dans une méthode de votre choix, ajoutez ces lignes. Ces lignes suppriment le processus excel spécifique avec lequel vous travaillez.
Modifiez-les selon vos besoins, mais la logique est la même.
if (ExcelApp != null)
{
int excelProcessId = 0;
//your Excel Application variable has access to its Hwnd property
GetWindowThreadProcessId(new IntPtr(ExcelApp.Hwnd), ref excelProcessId);
// you need System.Diagnostics to use Process Class
Process ExcelProc = Process.GetProcessById(excelProcessId);
if (ExcelProc != null)
{
ExcelProc.Kill();
}
}
Au total, votre programme devrait donc ressembler à ceci
class Program
{
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
static void Main(string[] args)
{
Application ExcelApp = new Application();
_Workbook ExcelWrkBook = ExcelApp.Workbooks.Open(filePath);
_Worksheet ExcelWrkSht = ExcelWrkBook.ActiveSheet;
ExcelWrkSht.Cells[1, 2] = "70";
if (ExcelApp != null)
{
int excelProcessId = 0; // simple declare, zero is merely a place holder
GetWindowThreadProcessId(new IntPtr(ExcelApp.Hwnd), ref excelProcessId);
Process ExcelProc = Process.GetProcessById(excelProcessId);
if (ExcelProc != null)
{
ExcelProc.Kill();
}
}
}
}
J'ai testé cela et cela supprime mes processus Excel comme indiqué dans le Gestionnaire des tâches.