views:

119

answers:

1

I have the following code and it does not delete the rows, it asks me to save over the current workbook but nothing is saved and EXCEL.EXE continues to run in Task Manager:

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);

        }
+1  A: 

I was not able to reproduce your issue exactly. However, in order for the EXCEL.EXE process to terminate completely, you need to make sure you call the ReleaseComObject method on every single COM object that you reference.

To do this, you can update your code as follows:

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);

}
Jim Killingsworth
Modified `get_Range` to say `get_Range("1:1", Type.Missing);` and it worked with your updates as well. Excel does not ask any questions about merging and closes successfully. Thanks for your help.
0A0D