Убить процесс Excel C#
У меня есть 2 процесса Excel. Например:
1) example1.xlsx 2) example2.xlsx
Как убить сначала "example1.xlsx"?
Я использую этот код:
foreach (Process clsProcess in Process.GetProcesses())
if (clsProcess.ProcessName.Equals("EXCEL")) //Process Excel?
clsProcess.Kill();
Это убивает обоих. Я хочу убить только одного... Спасибо.
9 ответов
Заголовок ProcessMainWindow сделает это за вас, он добавляет "Microsoft Excel - " к имени файла:
Итак, по сути (быстрый код):
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;
}
}
Если вы хотите убить определенный процесс, вам нужно будет предоставить немного больше информации.
Скопируйте и вставьте это. Это сделано!
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
Надеюсь это поможет.
В разделе пространства имен добавьте этот оператор using.
using System.Diagnostics;
В этом примере был создан экземпляр Excel следующим образом:
_Application excel = new _Excel.Application();
Этот метод убивает правильную задачу Excel, используя дескриптор окна.
public void Kill()
{
Int32 ExcelHwnd = excel.Hwnd;
Process[] localExcel = Process.GetProcessesByName("EXCEL");
foreach (Process Pgm in localExcel)
{
// xlMinimized keeps the screen from flashing when the user interface is made
// visible with the excel.visible needed to set the MainWindowHandle
excel.WindowState = XlWindowState.xlMinimized;
excel.Visible = true;
if ((Pgm.ProcessName == "EXCEL") && (ExcelHwnd == Pgm.MainWindowHandle.ToInt32()))
{
Pgm.Kill();
}
}
}
Это сработало без сбоев.
Вам нужно проверить файловые дескрипторы, которые открываются процессом, а затем убить его.
Как проверить, какой дескриптор файла удерживается процессом: Как получить список открытых дескрипторов файла по процессу в C#?
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Equals("EXCEL") && HasFileHandle(fileName, clsProcess))
{
clsProcess.Kill();
break;
}
}
Попробуйте получить заголовок главного окна
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
Используйте приведенную ниже логику для предотвращения процессов Zombie 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);