web-dev-qa-db-ja.com

プロセスExcelC#を強制終了します

Excelを2処理する必要があります。例えば:

1)example1.xlsx 2)example2.xlsx

最初の「example1.xlsx」を強制終了する方法は?

私はこのコードを使用します:

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

それは両方を殺します。 1つだけ殺したい…ありがとう。

9
Eriksson

ProcessMainWindow Titleがそれを行い、ファイルの名前に「MicrosoftExcel-」を追加します。

だから本質的に(クイックコード):

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();
        }
    }

使用する:

KillSpecificExcelFileProcess("example1.xlsx");

編集:動作することがテストおよび検証されています。

9
kd7

現在のコードが機能している場合、この修正により、「Excel」という名前で最初に見つかったプロセスが強制終了されます。

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

specificプロセスを強制終了する場合は、もう少し情報を提供する必要があります。

2
raveturned

kd7's 投稿は素晴らしい答えであり、うまく機能します。追加するのは2つだけです。

MainWindowTitle形式は--"Filename.xlsx - Excel"

Excelドキュメントが表示されていない場合、MainWindowTitle""になります。MainWindowTitle""を使用すると、すべてのゾンビExcelプロセスが強制終了されます。

2
Kezzla

これをコピーして貼り付けます。終わった!

 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 { }
         }
     }
1
monkSinha

Excelは常に単一のプロセスであるAFAIKになります。同じプロセス/ウィンドウは、その中の複数のドキュメントを開きます。やりたいことは、Excelオートメーションを使用して目的のドキュメントを閉じることです。おそらくこれはあなたが始めるのに役立つでしょう。 http://support.Microsoft.com/kb/302084

お役に立てれば。

1
Ani

プロセスによって開かれているファイルハンドルを確認してから、それを強制終了する必要があります。
プロセスが保持しているファイルハンドルを確認する方法: C#でプロセスごとに開いているファイルハンドルのリストを取得するにはどうすればよいですか?

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

以下のロジックを使用して、タスクマネージャーでゾンビExcelプロセスを防止します

 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
user3255770

メインウィンドウのタイトルを取得してみてください

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

googleで簡単に検索し、Process.MainWindowTitle()を試してExcelプロセスのタイトルを取得し、どれを強制終了するかを決定します。

この方法についてはよくわかりませんが、これが役立つことを願っています。

http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.mainwindowtitle.aspx

0
JXITC