1

データベース データから Excel ファイルを生成できる Windows フォーム アプリケーションを作成しています。データベースをファイルに入力した後、それを開いてマクロを実行し、ファイルを保存してから閉じています(または閉じていると思います)。これらのファイルは HDD に保存されますが、すべてのファイルが生成されたら、新しいファイル セットを生成できる必要があるため、新しいセットを生成する前に、古いファイルをすべて HDD から削除する必要があります。アプリケーションを一度実行した後、新しいファイル セットを生成しようとすると、ファイルの 1 つ (最初のバッチで生成された最後のファイル) が別のプロセスによって使用されているというエラーが表示されます。

ここに私のコードがあります:

public void RemoveRows_Macro(string fileName)
{

    Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    xlWorkBook = xlApp.Workbooks.Open(fileName);
    //xlApp.Visible = true;
    xlApp.DisplayAlerts = true;

    //Run the macro
    xlApp.Run("RemoveRows", 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, 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, Type.Missing);

    xlWorkBook.Save();

    xlWorkBook.Close(false);
    xlApp.Quit();
    releaseObject(xlApp);
    releaseObject(xlWorkBook);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error in releasing object :" + ex);
        obj = null;
    }
    finally
    {
        GC.Collect();
    }
} 

アプリケーションがファイルを解放していないため、何が間違っていますか?

4

5 に答える 5

2

最初にオブジェクトを解放してから、それらを割り当てた方法とは逆の順序でそれらを null として設定する必要があります。

releaseObject(xlWorkBook);
releaseObject(xlApp);
xlWorkBook = null;
xlApp = null;

Excel 相互運用を行っていたときに、このリンクが優れたリソースであることがわかりまし た。Excel 相互運用オブジェクトを適切にクリーンアップするにはどうすればよいですか?

于 2013-03-19T08:22:18.930 に答える
1
 finally
{
    GC.Collect(); 
   GC.WaitForPendingFinalizers();
}
于 2013-03-19T08:19:19.853 に答える
0

今はテストを実行できませんが、xlApp と xlWorkBook を releaseObject に渡す前に null に設定しているようです。その後、他の理由が考えられます。

于 2013-03-19T08:16:02.313 に答える
0

最初に xlApp と xlWorkBook を null に設定してから、解放しようとします。次の 2 行をコメントアウトしてみてください。

xlApp = null;
xlWorkBook = null;

これで問題は解決しますか?

于 2013-03-19T08:17:10.827 に答える
0

同じ問題が発生しましたが、修正しました。そのため、ファイルを作成したら、ファイルを閉じます。

xlWorkbook.SaveAs("nameExcel");
xlWorkbook.Close();
于 2020-07-08T08:02:47.760 に答える