当Microsoft Excel从应用程序外部打开并且无法关闭时,C#应用程序中使用的Excel文件将变为可见

时间:2013-06-11 04:26:38

标签: c# excel office-interop

我正在使用Interop Excel,我的代码工作正常

    class GeneralData
{   public static string excelPath = System.Windows.Forms.Application.StartupPath + @"\SteamProp";
    public static ExcelApp._Application oExcel;
    static ExcelApp.Workbooks oBooks;
    public static ExcelApp._Workbook oBook;
    static object oMissing = System.Reflection.Missing.Value;

    // Function will be used in Main Form Load Method
    public static void OpenExcelConnection()
    {
        oExcel = new ExcelApp.Application();
        oExcel.Visible = false;
        oBooks = oExcel.Workbooks;
        oBook = oBooks.Open(excelPath, oMissing, oMissing,
            oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);            
    }


    public static void ReleaseExcel()
    {
        try
        {
            oBook.Close(true, excelPath, oMissing);
            oExcel.Quit();

            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBook);
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBooks);
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcel);
            oBook = null;
            oBooks = null;
            oExcel = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        catch
        { }
    }

我使(OExcel)静态从不同的形式使用它。 我打开(OExcel)并使用它然后通过调用ReleaseExcel()方法关闭。 代码工作正常,但如果从应用程序外部打开了任何不同的excel文件,则C#应用程序中使用的文件对用户显示即使:

oExcel.Visible = false;

当调用此文件的ReleaseExcel()方法未关闭时,如果我关闭了C#应用程序并再次打开它,则会引发下一个异常:

  

Microsoft Jet数据库引擎无法打开文件“。它已由其他用户独占打开,或者您需要权限才能查看其数据。

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

处理完对象后,请使用

GC.Collect();

这就是我处理Excel对象的方式

        private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }