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つだけ殺したい…ありがとう。
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");
編集:動作することがテストおよび検証されています。
現在のコードが機能している場合、この修正により、「Excel」という名前で最初に見つかったプロセスが強制終了されます。
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Equals("Excel"))
{
clsProcess.Kill();
break;
}
}
specificプロセスを強制終了する場合は、もう少し情報を提供する必要があります。
kd7's 投稿は素晴らしい答えであり、うまく機能します。追加するのは2つだけです。
MainWindowTitle
形式は--"Filename.xlsx - Excel"
Excelドキュメントが表示されていない場合、MainWindowTitle
は""
になります。MainWindowTitle
に""
を使用すると、すべてのゾンビExcelプロセスが強制終了されます。
これをコピーして貼り付けます。終わった!
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 { }
}
}
Excelは常に単一のプロセスであるAFAIKになります。同じプロセス/ウィンドウは、その中の複数のドキュメントを開きます。やりたいことは、Excelオートメーションを使用して目的のドキュメントを閉じることです。おそらくこれはあなたが始めるのに役立つでしょう。 http://support.Microsoft.com/kb/302084
お役に立てれば。
プロセスによって開かれているファイルハンドルを確認してから、それを強制終了する必要があります。
プロセスが保持しているファイルハンドルを確認する方法: C#でプロセスごとに開いているファイルハンドルのリストを取得するにはどうすればよいですか?
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Equals("Excel") && HasFileHandle(fileName, clsProcess))
{
clsProcess.Kill();
break;
}
}
以下のロジックを使用して、タスクマネージャーでゾンビ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);
メインウィンドウのタイトルを取得してみてください
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Equals("Excel")&& clsProcess.MainWindowTitle =="example")
{
clsProcess.CloseMainWindow();
break;
}
}
googleで簡単に検索し、Process.MainWindowTitle()
を試してExcelプロセスのタイトルを取得し、どれを強制終了するかを決定します。
この方法についてはよくわかりませんが、これが役立つことを願っています。
http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.mainwindowtitle.aspx