chi*_*oro 11 c# com excel interop excel-2007
我错过了一个Excel.Application.Quit
或一个Excel.Application.BeforeQuit
事件.有人知道模仿这些事件的解决方法吗?
我通过COM Interop从C#WinForms应用程序访问Excel.给定一个Excel.Application
对象,我该怎么做:
请注意:由于我有一个COM引用Excel.Application
,当Excel被用户"退出"时,Excel进程不会退出.虽然这听起来很矛盾,但事实就是如此.通过"退出"我的意思是用户点击窗口右上角的"退出"或"十字按钮".窗口关闭,文件被卸载,加载项被卸载以及Excel除了我没有任何线索之外做的任何东西.但是我仍然可以使用该Application
对象来"恢复"该过程并使Excel再次可见,尽管这些加载项随后丢失,而且我还不知道还有什么处于未定义状态.
为了摆脱这个问题,我想在一开始就取消退出(想想BeforeQuit
Cancel = true
它是否存在),或者至少在退出Excel时得到通知,这样我就可以释放COM对象并使流程真正退出,下次我再次需要Excel时,我会知道我需要先启动它.
不幸的是,它是一个恶性循环:只要Excel运行,我需要COM对象.因此,在 Excel退出之前,我无法处理它们.另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,因此我不能等待进程退出事件或类似事件.
我有一种令人不快的感觉,就是我要把头撞在砖墙上......
请注意,我没试过这个.
创建一个包含代码的工作簿BeforeClose
.
例如
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub
Run Code Online (Sandbox Code Playgroud)
打开此工作簿以及您拥有的其他工作簿,并且不必隐藏它(如果整个应用程序不可见).
因此,如果您尝试退出excel实例,它将强制关闭此隐藏工作簿,这将提升其BeforeClose
事件并且您可以编写代码以阻止它关闭.
请注意,上面的代码是VB6(VBA),需要转换为c#.
发表评论,如果您发现转换有任何困难.
如果要隐藏工作簿,可以这样做
Workbooks("my workbook").Windows(1).Visible = False
Run Code Online (Sandbox Code Playgroud)
注意:工作簿有一个Windows
集合.上面的代码试图隐藏第一个窗口.
我不知道,一本工作簿可以有多个窗口吗?如果是这样,怎么样?
有一篇知识库文章,如何自动化Excel,然后知道用户在C++中关闭了它.我没有把它移植到C#,但它可能不是很多工作.