2012-02-16 29 views
8

Tôi phải có 2 quy trình xuất sắc. Ví dụ:Giết quy trình Excel C#

1) example1.xlsx 2) example2.xlsx

Làm thế nào để giết đầu tiên "example1.xlsx"?

tôi sử dụng mã này:

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

Đó giết cả hai. Tôi muốn giết chỉ một ... Cảm ơn bạn.

+0

vừa tìm kiếm nhanh trên Google, hãy thử Xử lý.MainWindowTitle() để lấy tiêu đề của quá trình Excel, và quyết định cái nào là bạn muốn giết. – JXITC

+1

Cách thích hợp để thực hiện điều này là theo dõi và giải phóng đối tượng Application COM và tất cả phụ thuộc của nó. – Motes

Trả lời

7

Các ProcessMainWindow Tiêu đề sẽ làm điều đó cho bạn, nó gắn thêm "Microsoft Excel -" vào tên của tập tin:

Vì vậy, về cơ bản (mã nhanh):

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

Sử dụng:

KillSpecificExcelFileProcess("example1.xlsx"); 

Chỉnh sửa: Đã kiểm tra và xác minh để hoạt động.

+0

Không hoạt động ... Tôi có rất nhiều quá trình chạy Excel ... – Eriksson

+0

Bạn có ý nghĩa gì khi nó không hoạt động, bạn có thử mở example1.xlsx và xem nó có đóng nó không? Bạn đang tự động hóa Excel với mã khác đang gây ra nhiều EXCEL.exe 's để đẻ trứng – kd7

+0

Nếu bạn có hai tài liệu excel mở ra, và nếu bạn chạy mã này, đóng cả hai .... – Eriksson

1

Excel sẽ luôn là một quá trình đơn, AFAIK. Cùng một quá trình/cửa sổ mở nhiều tài liệu bên trong nó. Những gì bạn muốn làm là sử dụng tự động hóa Excel để ĐÓNG tài liệu bạn muốn. Có lẽ điều này sẽ giúp bạn bắt đầu. http://support.microsoft.com/kb/302084

Hy vọng điều này sẽ hữu ích.

2

Nếu mã hiện tại của bạn đang hoạt động, sửa đổi này sẽ giết quá trình đầu tiên nó tìm thấy với tên "EXCEL".

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

Nếu bạn muốn giết cụ thể một quá trình , bạn sẽ phải từ bỏ một chút biết thêm thông tin.

0

Bạn cần kiểm tra các tệp xử lý, được mở theo quy trình và sau đó giết nó.
Làm thế nào để kiểm tra tập tin xử lý quá trình đang nắm giữ: 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

Thư viện nào được định nghĩa HasFileHandle? Cảm ơn u – Eriksson

+0

Đó là một pseudomethod, bạn có thể tìm thấy thực hiện trong liên kết stackoverflow đề cập của tôi. – Giedrius

0

Hãy thử lấy tiêu đề cửa sổ chính

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

Sử dụng dưới đây logic để ngăn chặn quá trình Zombie Excel trong Task Manager

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

Kịch bản này sẽ kế thừa các ưu điểm khác được mở trước khi ứng dụng của bạn bắt đầu. – user3255770

1

Sao chép và dán này. Xong rôi!

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 { } 
     } 
    } 
Các vấn đề liên quan