2012-02-16 11 views
8

Muszę 2 przetworzyć Excel. Na przykład:Kill Process Excel C#

1) example1.xlsx 2) example2.xlsx

Jak zabić pierwszego "example1.xlsx"?

używam tego kodu:

foreach (Process clsProcess in Process.GetProcesses()) 
    if (clsProcess.ProcessName.Equals("EXCEL")) //Process Excel? 
      clsProcess.Kill(); 

To Kill a oba. Chcę zabić tylko jednego ... Dziękuję.

+0

Właśnie przeprowadziliśmy szybkie wyszukiwanie w Google, spróbuj Przetw.MainWindowTitle(), aby uzyskać tytuł procesu Excel i zdecydować, który z nich chcesz zabić. – JXITC

+1

Właściwym sposobem wykonania tej czynności jest śledzenie i zwalnianie obiektu COM aplikacji i wszystkich jego zależności. – Motes

Odpowiedz

7

ProcessMainWindow Tytuł zrobi to za ciebie, to dołącza „Microsoft Excel -” do nazwy pliku:

Więc zasadniczo (szybki kod):

private void KillSpecificExcelFileProcess(string excelFileName) 
    { 
     var processes = from p in Process.GetProcessesByName("EXCEL") 
         select p; 

     foreach (var process in processes) 
     { 
      if (process.MainWindowTitle == "Microsoft Excel - " + excelFileName) 
       process.Kill(); 
     } 
    } 

Zastosowanie:

KillSpecificExcelFileProcess("example1.xlsx"); 

Edytuj: Przetestowany i zweryfikowany do działania.

+0

Nie działa ... Mam wiele proces Excel działa ... – Eriksson

+0

Co masz na myśli, że to nie działa, czy próbujesz po prostu otwarcie example1.xlsx i zobaczyć, czy to zamyka? Czy automatyzujesz program Excel innym kodem, który powoduje, że wiele plików EXCEL.exe spawnuje się – kd7

+0

Jeśli masz dwa dokumenty Excela otwarte i jeśli uruchomisz ten kod, to zamkniesz oba ... – Eriksson

1

Excel zawsze będzie pojedynczym procesem, AFAIK. Ten sam proces/okno otwiera wiele dokumentów wewnątrz niego. To, co chcesz zrobić, to użyć automatyzacji Excela do ZAMKNIĘCIA dokumentu, który chcesz. Być może to cię zacznie. http://support.microsoft.com/kb/302084

Mam nadzieję, że to pomoże.

2

Jeśli aktualny kod działa, poprawka ta powinna zabić pierwszy znaleziony proces o nazwie "EXCEL".

foreach (Process clsProcess in Process.GetProcesses()) 
{ 
    if (clsProcess.ProcessName.Equals("EXCEL")) 
    { 
    clsProcess.Kill(); 
    break; 
    } 
} 

Jeśli chcesz zabić specyficzny proces, będziesz musiał podać nieco więcej informacji.

0

Należy sprawdzić uchwyty plików, które są otwierane przez proces, a następnie zabić.
Jak sprawdzić, który plik zajmuje proces trzyma: How do I get the list of open file handles by process in C#?

foreach (Process clsProcess in Process.GetProcesses()) 
{ 
    if (clsProcess.ProcessName.Equals("EXCEL") && HasFileHandle(fileName, clsProcess)) 
    { 
     clsProcess.Kill(); 
     break; 
    } 
} 
+0

Jaka jest biblioteka HasFileHandle? Dziękuję u – Eriksson

+0

To pseudometod, możesz znaleźć implementację w moim wspomnianym linku stackoverflow. – Giedrius

0

Spróbuj znaleźć głównego Window Title

foreach (Process clsProcess in Process.GetProcesses()) 
    { 
     if (clsProcess.ProcessName.Equals("EXCEL")&& clsProcess.MainWindowTitle =="example") 
     { 
      clsProcess.CloseMainWindow(); 
      break; 
     } 
    } 
0

Zastosowanie poniżej logiki, aby zapobiec procesom Zombie Excel w Menedżerze zadań

List<int> GetAllExcelProcessID() 
    { 
     List<int> ProcessID = new List<int>(); 
     if (currentExcelProcessID == -1) 
     { 
      List<System.Diagnostics.Process> currentExcelProcessList = System.Diagnostics.Process.GetProcessesByName("EXCEL").ToList(); 
      foreach(var item in currentExcelProcessList) 
      { 
       ProcessID.Add(item.Id); 
      } 
     } 
     return ProcessID; 
    } 
int GetApplicationExcelProcessID(List<int> ProcessID1, List<int> ProcessID2) 
    { 
     foreach(var processid in ProcessID2) 
     { 
      if (!ProcessID1.Contains(processid)) { currentExcelProcessID = processid; } 
     } 
     return currentExcelProcessID; 
    } 
void KillExcel() 
    { 
     System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessById(currentExcelProcessID); 
     process.Kill(); 
    } 
List<int> ProcessID1 = GetAllExcelProcessID(); 
       excel = new Excel.Application(); 
       List<int> ProcessID2 = GetAllExcelProcessID(); 
       currentExcelProcessID = GetApplicationExcelProcessID(ProcessID1, ProcessID2); 
+0

Ten skrypt zawiera inne programy, które są otwierane przed uruchomieniem aplikacji. – user3255770

1

Skopiuj i wklej. Zrobione!

System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel"); 
    foreach (System.Diagnostics.Process p in process) 
    { 
     if (!string.IsNullOrEmpty(p.ProcessName)) 
     { 
      try 
      { 
       p.Kill(); 
      } 
      catch { } 
     } 
    }