在Silverlight中使用COM组件操作Excel,大概需求是在Silverlight应用程序中初始化Excel表格的相关基本信息,然后打开Excel。用户在Excel中输入相关数据,最后在用户点击保存时,把特定一列的数据返回到Silverlight应用程序界面。
dynamic _excel = AutomationFactory.CreateObject("Excel.Application");
问题在于,Excel的关闭是用户自行决定的,不能在用户保存成功后强制关闭......所以在下面的事件中不能做强制销进程。
_excel.WorkbookAfterSave += new AppEvents_WorkbookAfterSaveEventHandler(ExcelApp_WorkbookAfterSave);
还好,有另外一个事件:
_excel.WorkbookBeforeClose += new AppEvents_WorkbookBeforeCloseEventHandler(ExcelApp_WorkbookBeforeClose);
因为这是在关闭前的,用户也有可能在点击关闭按钮时没有保存,弹出确认框的时候,点了取消……所以不能 _excel.Workbooks.Close()
注:((IDisposable)_excel).Dispose() 这句最重要了,如果没这个,EXcel.EXE 进程会一直在
/// <summary> /// 关闭前 /// </summary> private void ExcelApp_WorkbookBeforeClose(dynamic Wb, ref bool Cancel) { if (_excel != null) { // _excel.Workbooks.Close();//不能用这句,否则_excel已经为null了 _excel.Quit(); ((IDisposable)_excel).Dispose(); _excel = null; GC.Collect(); } }
OK~这样,不管是点击保存然后关闭,还是不保存就关闭,当Excel关闭时,相应的Excel.EXE进程就会自动销毁 :(
补充一些:
AppEvents_WorkbookBeforeCloseEventHandler、AppEvents_WorkbookAfterSaveEventHandler是参照MSDN写的委托变量
delegate void AppEvents_WorkbookBeforeCloseEventHandler([In] dynamic Wb, [In, Out] ref bool Cancel); //delegate void AppEvents_WorkbookBeforeSaveEventHandler(dynamic Wb, bool SaveAsUI, ref bool Cancel); delegate void AppEvents_WorkbookAfterSaveEventHandler(dynamic Wb, bool Success);