2011-04-01 11 views
10

मेरे पास निम्न कोड है:सी # = एक्सेल प्रक्रियाएं क्यों समाप्त नहीं हो रही हैं?

private bool IsMousetrapFile(string path) 
    { 

     logger.Log(validateFileMessage + path); 

     Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
     Excel.Workbooks workbooks = xlApp.Workbooks; 
     Excel.Workbook xlWorkBook = workbooks.Open(path, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
     Excel.Sheets worksheets = (Excel.Sheets)xlWorkBook.Worksheets; 
     Excel.Worksheet ws = null; 


     foreach (string sheet in expectedWorksheets) 
     { 

      try 
      { 

       ws = (Excel.Worksheet)worksheets.get_Item(sheet); 
       logger.Log(validMousetrapFileMessage + path); 
      } 
      catch 
      { 
       logger.Log(validateSheetError + sheet + ": " + path); 
       if (ws != null) 
        Marshal.ReleaseComObject(ws); 
       Marshal.ReleaseComObject(worksheets); 
       Marshal.ReleaseComObject(xlWorkBook); 
       Marshal.ReleaseComObject(workbooks); 
       Marshal.ReleaseComObject(xlApp); 

       return false; 

      } 

     } 

     if (ws != null) 
      Marshal.ReleaseComObject(ws); 
     Marshal.ReleaseComObject(worksheets); 
     Marshal.ReleaseComObject(xlWorkBook); 
     Marshal.ReleaseComObject(workbooks); 
     Marshal.ReleaseComObject(xlApp); 

     return true; 


    } 

प्रभावी रूप से, यह जांचता है कि एक्सेल कार्यपुस्तिका में विशिष्ट चादरें हैं या नहीं। भले ही वहां है या नहीं, मैं एक्सेल प्रक्रियाओं को समाप्त करना चाहता हूं। हालांकि, प्रत्येक बार जब कोई नई कार्यपुस्तिका खुलती है, तो एक नई प्रक्रिया को जोड़ा जाता है, और कभी नहीं हटाया जाता है?

पीएस। मुझे पता है कि वहां डुप्लिकेट कोड है .... इसे जल्द ही सूचित किया जाएगा :)

+2

आप की तरह शिकार पूछा यहाँ: http://stackoverflow.com/questions/5357244/quitting-excel-with-c-while-using-excel-automation – gideon

+0

अधिक जानकारी के लिए लिंक देखें जब एक्सेल अभी भी कॉल करता है जब आप कॉल करते हैं। – gideon

उत्तर

10

Excel.Application.Quit() का उपयोग करें जब आप प्रसंस्करण या जो भी कर रहे हैं, उसके साथ किया जाता है।

आपके मामले में: xlApp.Quit();

अद्यतन:

@Lasse V. Karlsen ने बताया क्या हुआ अगर एक्सेल पहले से ही चल रहा था क्या करना है। ठीक है, यहाँ एक समाधान है:

private void TestMethod() 
{ 
    bool excelWasRunning = System.Diagnostics.Process.GetProcessesByName("excel").Length > 0; 

    // your code 

    if (!excelWasRunning) 
    { 
     xlApp.Quit(); 
    } 
} 
+0

बिल्कुल सही - धन्यवाद। मैंने कोशिश की थी, लेकिन रिलीजिंग कॉमोबजेक्ट के बाद, और निश्चित रूप से यह एक अपवाद फेंक दिया। रिलीज से पहले इसका इस्तेमाल एक आकर्षण काम करते हैं। –

+0

@ डैरेन यंग: gr8 – HABJAN

+0

यह निश्चित रूप से बहुत कठिन है कि उपयोगकर्ता ने एक्सेल खोला और फिर एप्लिकेशन शुरू किया ... –

1

कुछ दिन वापस मैं निर्यात/आयात को लागू किया है (मैं कोड का परीक्षण नहीं किया था, यह केवल आपके जानकारी देने के लिए है)। जब मैंने Google पर खोज की है तो मैं कहीं से कोड नीचे आया हूं और यह ठीक काम करता है।

ExportToExcel() 
{ 
    try 
    { 
     //your code 
    } 
    catch (Exception ex) 
     { 

     } 
     finally 
     { 
      TryQuitExcel(Application_object); 
     } 
} 
private static void TryQuitExcel(Microsoft.Office.Interop.Excel.Application application) 
     { 
      try 
      { 
       if (application != null && 
        application.Workbooks != null && 
        application.Workbooks.Count < 2) 
       { 
        application.DisplayAlerts = false; 
        application.Quit(); 
        Kill(application.Hwnd); 
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(application); 
        application = null; 
       } 
      } 
      catch 
      { 
       /// Excel may have been closed via Windows Task Manager. 
       /// Skip the close. 
      } 
     } 


private static void Kill(int hwnd) 
    { 
     int excelPID = 0; 
     int handle = hwnd; 
     GetWindowThreadProcessId(handle, ref excelPID); 

     Process process = null; 
     try 
     { 
      process = Process.GetProcessById(excelPID); 

      // 
      // If we found a matching Excel proceess with no main window 
      // associated main window, kill it. 
      // 
      if (process != null) 
      { 
       if (process.ProcessName.ToUpper() == "EXCEL" && !process.HasExited) 
        process.Kill(); 
      } 
     } 
     catch { } 
    } 
3

मेरे समाधान

[DllImport("user32.dll")] 
static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId); 

private void GenerateExcel() 
{ 
    var excel = new Microsoft.Office.Interop.Excel.Application(); 
    int id; 
    // Find the Process Id 
    GetWindowThreadProcessId(excel.Hwnd, out id); 
    Process excelProcess = Process.GetProcessById(id); 

try 
      { 
       // Your code 
} 
finally 
{ 
    excel.Quit(); 

    // Kill him ! 
    excelProcess.Kill(); 
} 
संबंधित मुद्दे