Home » excel » Excel automation C#: How to delete multiple rows?

Excel automation C#: How to delete multiple rows?

Posted by: admin April 23, 2020 Leave a comment

Questions:

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);
}
How to&Answers:

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

}