Excel automation C#: How to delete multiple rows?
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开发者_StackOverflow社区.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);
}
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);
}
精彩评论