1

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) を static にしました。(OExcel) を開いて使用し、最後に ReleaseExcel() メソッドを呼び出して閉じます。コードは正常に動作しますが、アプリケーションの外部から開かれた別の Excel ファイルがあった場合、C# アプリケーションで使用されたファイルは次のようにユーザーに表示されます。

oExcel.Visible = false;

このファイルを呼び出した ReleaseExcel() メソッドが閉じず、C# アプリケーションを閉じて再度開くと、次の例外が発生します。

Microsoft Jet データベース エンジンはファイル " を開けません。このファイルは既に別のユーザーによって排他的に開かれているか、そのデータを表示する権限が必要です。

それで、あなたは私を助けてくれませんか。

4

1 に答える 1

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();
        }
    }
于 2013-06-11T04:46:50.160 に答える