3

次のコードがあり、行が削除されず、現在のワークブックに保存するように求められますが、何も保存されず、タスク マネージャーで EXCEL.EXE が実行され続けます。

protected void OpenExcelWorkbook(string fileName)
{
    _app = new Excel.Application();

    if (_book == null)
    {
        _books = _app.Workbooks;
        _book = _books.Open(fileName, 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);
        _sheets = _book.Worksheets;
    }
}

protected void CloseExcelWorkbook()
{
    _book.Save();
    _book.Close(false, Type.Missing, false);
}


protected void NAR(object o)
{
    try
    {
        if (o != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    finally
    {
        o = null;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    OpenExcelWorkbook(@"C:\Book2.xls");
    _sheet = (Excel.Worksheet)_sheets[1];
    _sheet.Select(Type.Missing);

    Excel.Range range = _sheet.get_Range("A1", "A3");            
    range.EntireRow.Delete(Type.Missing);            
    NAR(range);
    NAR(_sheet);
    CloseExcelWorkbook();
    NAR(_book);
    _app.Quit();

    NAR(_app);
}
4

1 に答える 1

3

問題を正確に再現できませんでした。ReleaseComObjectただし、EXCEL.EXE プロセスを完全に終了するには、参照するすべての COM オブジェクトでメソッドを呼び出す必要があります。

これを行うには、次のようにコードを更新できます。

private void button1_Click(object sender, EventArgs e)
{
    OpenExcelWorkbook(@"C:\Book2.xls");
    _sheet = (Excel.Worksheet)_sheets[1];
    _sheet.Select(Type.Missing);

    Excel.Range range = _sheet.get_Range("A1", "A3");
    Excel.Range entireRow = range.EntireRow; // update
    entireRow.Delete(Type.Missing);
    NAR(entireRow); // update
    NAR(range);
    NAR(_sheet);
    NAR(_sheets); // update
    CloseExcelWorkbook();
    NAR(_book);
    NAR(_books); // update
    _app.Quit();

    NAR(_app);

}
于 2010-08-24T02:59:11.447 に答える