Is there a better way than to Kill() a process that archives the same result. When I Kill() an Excel process, the next time I open any Excel Worksheet, "Do开发者_如何学编程cument Recovery" sidebar is opened, which I do not want to do.
Add a .Net reference to Microsoft.Office.Interop.Excel. Then take a look at the following code I knocked together:
Microsoft.Office.Interop.Excel.ApplicationClass _excel;
Microsoft.Office.Interop.Excel.Workbook _workBook;
private void Form1_Load(object sender, EventArgs e)
{
_excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
_excel.Visible = true;
// Open the workbook
_workBook = _excel.Workbooks.Open(@"DataSheet.xls",
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);
}
private void btn_Close_Click(object sender, EventArgs e)
{
GC.Collect();
GC.WaitForPendingFinalizers();
_workBook.Close(false, Type.Missing, Type.Missing);
_excel.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_workBook);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_excel);
}
Not sure if this will help with Excel running in a web browser. If you can grab the instance of Excel that's running you can find the workbook you want to close...
try
{
// Grab a reference to an open instance of Excel
var oExcelApp =
(Microsoft.Office.Interop.Excel.Application)
Marshal.GetActiveObject("Excel.Application");
// Loop around the workbooks to find the one you want to close
for (int i = 1; i <= oExcelApp.Workbooks.Count; i++)
{
if (oExcelApp.Workbooks[i].Name == "requiredname")
oExcelApp.Workbooks[i].Close(Type.Missing, Type.Missing, Type.Missing);
}
// Clear up...
Marshal.FinalReleaseComObject(oExcelApp);
}
catch(Exception ex)
{
// Something went wrong...
}
Since this is Excel, how about actually talking to Excel and asking it to close nicely? You can do this using COM.
An option could be to call Process.CloseMainWindow().
加载中,请稍侯......
精彩评论