2012-02-16 19 views
8

मुझे एक्सेल को 2 प्रक्रिया करना है। उदाहरण के लिए:मारने की प्रक्रिया एक्सेल सी #

1) example1.xlsx 2) example2.xlsx

पहले को मारने के लिए कैसे "example1.xlsx"?

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

यह एक दोनों को मारने:

मैं इस कोड का उपयोग करें। मैं सिर्फ एक को मारना चाहता हूं ... धन्यवाद।

+0

ने Google पर त्वरित खोज की, प्रक्रिया का प्रयास करें।मुख्य प्रक्रिया का शीर्षक प्राप्त करने के लिए MainWindowTitle(), और यह तय करें कि आप कौन सी हत्या करना चाहते हैं। – JXITC

+1

ऐसा करने का उचित तरीका एप्लिकेशन COM ऑब्जेक्ट और इसकी सभी निर्भरताओं को ट्रैक और रिलीज़ करना है। – Motes

उत्तर

7

ProcessMainWindow शीर्षक यह तुम्हारे लिए क्या करेंगे, यह संलग्न कर देता है "माइक्रोसॉफ्ट एक्सेल -" फ़ाइल के नाम से:

तो अनिवार्य रूप से (त्वरित कोड):

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"); 

संपादित करें: परीक्षण और परीक्षण के लिए सत्यापित। कार्य प्रबंधक में ज़ोंबी एक्सेल प्रक्रियाओं को रोकने के लिए

तर्क नीचे
+0

काम नहीं करता है ... मेरे पास एक्सेल चलने की बहुत सारी प्रक्रिया है ... – Eriksson

+0

आपका क्या मतलब है कि यह काम नहीं करता है, क्या आपने केवल example1.xlsx खोलने का प्रयास किया है और देखें कि यह इसे बंद कर देता है या नहीं? क्या आप एक्सेल को अन्य कोड के साथ स्वचालित कर रहे हैं जो एकाधिक EXCEL.exe को – kd7

+0

तक बढ़ा रहा है यदि आपके पास दो एक्सेल दस्तावेज़ खोले गए हैं, और यदि आप यह कोड चलाते हैं, तो यह दोनों को बंद करें .... – Eriksson

1

एक्सेल हमेशा एक ही प्रक्रिया होगी, AFAIK। एक ही प्रक्रिया/खिड़कियां इसके अंदर कई दस्तावेज़ खोलती हैं। आप जो दस्तावेज़ करना चाहते हैं वह उस दस्तावेज़ को बंद करने के लिए Excel स्वचालन का उपयोग करना है जिसे आप चाहते हैं। शायद यह आपको शुरू कर देगा। http://support.microsoft.com/kb/302084

उम्मीद है कि इससे मदद मिलती है।

2

यदि आपका वर्तमान कोड काम कर रहा है, तो इस संशोधन को "एक्सेल" नाम से प्राप्त पहली प्रक्रिया को मारना चाहिए।

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

आप एक विशिष्ट प्रक्रिया को मारने के लिए चाहते हैं, आप थोड़ा और अधिक जानकारी देने के लिए करने जा रहे हैं।

0

आपको फ़ाइल हैंडल की जांच करने की आवश्यकता है, जो प्रक्रिया द्वारा खोले जाते हैं और फिर इसे मार देते हैं।
की जांच कैसे करें जो फ़ाइल हैंडल प्रक्रिया कर रहा है: 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

क्या लाइब्रेरी परिभाषित है HasFileHandle? धन्यवाद – Eriksson

+0

यह एक छद्म विधि है, आप मेरे निर्दिष्ट स्टैक ओवरफ्लो लिंक में कार्यान्वयन पा सकते हैं। – Giedrius

0

हो रही मुख्य विंडो शीर्षक

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

सिर्फ गूगल पर एक त्वरित खोज किया था प्रयास करें, एक्सेल का खिताब पाने के लिए Process.MainWindowTitle() कोशिश प्रक्रिया, और तय करें कि आप कौन सी हत्या करना चाहते हैं।

मैं इस विधि के बारे में निश्चित नहीं हूँ, लेकिन उम्मीद है कि इस में मदद मिलेगी:

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

0

उपयोग

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

1

कॉपी और पेस्ट करें। हॊ गया!

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 { } 
     } 
    } 
संबंधित मुद्दे