2011-08-30 71 views
1

我正在使用Microsoft.Office.Interop.Excel创建Excel报告与C#。这些报告有大量的图形,需要很长时间准备。在准备过程中,我的程序使用的Excel应用程序的实例对用户是隐藏的。防止用户使用Excel的实例

我的问题是,Microsoft Office倾向于自动共享应用程序实例。如果用户打开Excel工作簿,则Excel将尝试查找正在运行的Excel实例并从中打开该文档。当用户尝试在程序运行时打开Excel工作簿时,它会附加到我的程序使用的实例上。

这会产生两个问题。首先,它使我的报告变得可见,然后才能看到它们。其次,我的程序现在需要与Excel实例关注用户,而我的程序通常会丢失。

那么,有什么办法让Excel实例拒绝来自用户的请求(它应该仍然服从我的程序)来打开文档,并且让Office在决定如何打开Excel时忽略我的实例文件?

+2

如果MS没有从程序中基本运行Excel的完整副本的情况下生成Excel报告,这不是很好吗? MS产品通常在一起运行得非常好,但办公文档生成往往是那些突出显示为混乱的东西之一。 – Kibbee

回答

1

您可以处理Application.WorkbookOpen事件。在这里,请启动Excel的第二个实例并使其打开工作簿,或者使用错误消息关闭工作簿。

我还看到了Application.Interactive属性。我没有玩过这个,但它可能对你有用。

+0

那么,交互属性不起作用 - 工作簿仍然在我的实例上打开 - 一旦它们打开,它们根本无法触及。 我会尝试你的第一个建议。我必须检查只读属性,但还有其他需要查找的内容吗?例如,用户尝试打开的工作簿中的WorkbookOpen事件或从互联网下载的工作簿(使用“打开”而不是“保存”)? –

+0

将显示Excel显示的任何工作簿的事件,而不管它是什么来源。当您单击网页上的“打开”时,浏览器实际上将文件保存到临时文件夹中,然后将其打开,因此与打开本地文件没有区别。 –

0

我做了一个小实验,我认为这会工作:

每当你开始使用Excel时,创建两个实例,并与第二个工作。当你完成你的工作时,删除第二个实例及其对象,然后检查第一个的“UserControl”属性。如果它返回“true”,那么只删除该对象,但留下该实例的进程。如果它返回“false”,那么也删除该实例。

据我所知,用户可以打开和关闭任意数量的工作簿,并且它将使用您创建的第一个实例,只要您不删除它,并且第二个实例将被取消删除。