Michael
Michael

Reputation: 123

How to check if Excel is open, and if so, save and close it C#

I want to check if excel is open. If it is, I want to save the active workbook and close excel. Essentially, my goal is to kill every excel process, but before doing so I want to save the excel workbook. This is my code...

Process[] localByName = Process.GetProcessesByName("excel");
        for (int i = 0; i < localByName.Length; i++)
        {
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook wb = xlApp.ActiveWorkbook; 
            wb.Save();  // I get an error here. "Object reference not set to an instance of an object".
            GC.Collect();
            GC.WaitForPendingFinalizers();
            wb.Close(); 
            Marshal.FinalReleaseComObject(wb);  
            xlApp.Quit();    
            Marshal.FinalReleaseComObject(xlApp);    
        }

I read that xlApp.ActiveWorkbook gets the workbook in read only mode. Could this be my problem? If so please propose a successful way to go about this. Thank you!

Upvotes: 1

Views: 1702

Answers (1)

Rikus Honey
Rikus Honey

Reputation: 558

> Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); this creates a new instance of the Excel.Application COM Object and does not return an active instance. To do so, try

Excel.Application xlApp = null;
while(xlApp == null)
{
    try
    {
        xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        // no more instances/error, exit out of loop
        break;
    }

    // do whatever with the instance
    Workbook wb = xlApp.ActiveWorkbook; 
    wb.Save();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    wb.Close(); 
    Marshal.FinalReleaseComObject(wb);  
    xlApp.Quit();    
    Marshal.FinalReleaseComObject(xlApp);

    // set null to continue loop
    xlApp = null;
}

Source: Get instance of Excel application with C# by Handle

Upvotes: 1

Related Questions