2016-12-15 208 views
0

我们已经开发了一个VSTO加载项为Excel,从Web服务器拉Excel表格,并允许用户操纵表中的数据。它与文件的本地副本一起工作,但我们并不真正关心该副本。但是我们的一些客户也安装了“iManage Integration for Office”,这些客户会遇到奇怪的行为。在这种环境下,我们无法取消关闭事件。如何解决iManage的限制,在Excel VSTO插件

更具体地讲,如果用户打开了一个文件,并进行更改,然后关闭该文件,我们的事件处理程序火灾,促使他们将更改保存(在服务器上的数据)。如果他们选择取消,或者如果他们选择保存并由于某种原因保存失败,我们设置取消= true以尝试保持文件打开。通常这是完美的。

对于那些使用iManage的客户,文件无论如何都会关闭。如果我们的代码已经保存了本地文件副本,那么文件就会关闭。如果本地副本尚未保存,则用户将在iManage提示后收到另一个提示,询问他们是否要保存该文件。从这里,用户可以点击取消,文件保持打开状态。但是用户报告说,在第一次点击取消后看到第二个提示是令人困惑的。他们不愿意禁用iManage插件。我们希望能够在这种情况下保持文件打开状态,最好不要看到iManage提示符。

在测试环境中工作的客户机设置为我(Excel 2010中),我已经尝试了几件事情:

  • 我试图设置在工作簿上水平BeforeClose和应用级WorkbookBeforeClose取消;没有人工作(文件仍然关闭时,只要启用iManage)
  • 我试图确保我的WorkbookBeforeClose处理程序最后注册,通过注册它在工作簿级别的事件处理程序;没有变化
  • 我可以使用iManage功能区手动切换到本地模式,这使一切正常,但我不知道是否/如何通过代码进行更改。
  • 我可以在Globals.ThisAddIn.Application.COMAddIns中找到iManage插件;我尝试设置Connect = false,但是这给出了一个错误,只有管理员可以连接/断开插件。
  • 我可以在关闭事件中保存本地文件,然后执行另存为创建第二个副本;第二个副本现在处于活动状态,iManage将其关闭;然后我重新打开原始的本地文件。它对用户来说看起来很不错,但后来我有一堆COM引用旧文件上的单元格,而这些都是垃圾。我可能会循环并序列化它们,并用新文件重新创建它们,但编码和运行会很耗时,所以我首先在寻找其他想法。

有什么办法可以保持文件打开,而不会让用户做任何额外的事情?

UPDATE

使用iManage的9.3.0.0和Excel 2010中,我创建了一个VBA宏一起工地集成接口库(防爆)的引用。事件发生,但文件仍然关闭。如果我没有设置Saved属性,并且在网格上输入,我总是会收到iManage提示,询问我是否要保存。

Private WithEvents oWS As iManageExtensibility 

Private Sub oWS_DocumentBeforeClose2(ByVal Doc As Variant, IgnoreIManageClose As Boolean, Cancel As Boolean) 
    IgnoreIManageClose = True 
    Cancel = True 
End Sub 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Set oWS = Application.COMAddIns("WorkSiteOffice2007Addins.Connect").Object 
    Cancel = True 
    ActiveWorkbook.Saved = True 
End Sub 

回答

1

您不需要禁用Office的iManage集成加载项。您的应用程序应检测到iManage集成加载项的存在,然后处理该加载项自身的等效关闭事件

要做到这一点,请首先通过检查Excel Application.COMAddins集合来获取iManage加载项的实例以及使用WorkSiteOffice2003Addins.Connect(Excel 2003或更早版本)或WorkSiteOffice2007Addins.Connect(Excel 2007或更高版本)的ProgID提取COM加载项实例。

实际上也应该有一个所谓的“向后兼容性”加载项,安装时也注册了ProgID oUR02k.Connect,您可以参考。同样,无论是否安装,都取决于计算机上安装的FileSite/DeskSite版本。

所有这些都可能让你感到困惑,但是这是因为这些插件多年来发生了变化,所以它取决于iManage客户端的大小(即FileSite,DeskSite)以及Office的版本,重新定位。您可能需要补偿代码中不同的Excel/iManage客户端版本

一旦您拥有正确的COM加载项参考,请检查COMAddin.Object属性。此值表示iManage的Office集成的实例附加

从那里,你可以施放该对象的iManageExtensibility

强类型的COM接口,然后,您就可以挂接到所有的Office应用程序事件iManage已经劫持(很像您在应用程序中所做的),并对这些事件作出响应,而不是本机Excel。

在你的情况下,你需要监视DocumentBeforeClose2事件。注意末尾的字符'2'。还有一个名为DocumentBeforeClose遗留事件,但较新的DocumentBeforeClose2有以下方法签名:

DocumentBeforeClose2(object doc, ref bool ignoreimanageclose, ref bool cancel)

最后,在DocumentBeforeClose2事件处理程序添加你的业务逻辑取消close事件和/或iManage的关闭事件。您可以通过将ignoreimanageclose和/或cancel布尔值设置为true/false。在这种情况下,doc参数将Excel工作簿中的实例,所以你可以放心地将其转换为,如果你想

PS的Excel.Workbook接口:如果您正在开发对iManage的API和需要的支持,你应该考虑购买iManage的SDK 。该SDK包含各种API,代码示例的帮助,而且我相信它可以让您访问某些开发人员支持。

+0

非常感谢这个详细的答案。我会尽快尝试。 – Mishelle

+0

这没有奏效。我为com插件对象添加了DocumentBeforeClose2的事件处理程序,并在关闭文件时触发。将这些变量中的任何一个设置为true都没有效果 - 如果有未保存的更改,我会得到iManage提示,否则文件将关闭 – Mishelle

+0

我无法为您的开发环境说话,但是我只是自己测试了一下,它完美地工作:I处理DocumentBeforeClose2事件,关闭未保存的文档,然后以编程方式将事件签名中的IgnoreManageClose和Cancel参数设置为True。结果是文档没有关闭。我跑了两次相同的测试:首先在Office 2016 + FileSite 9.3.1版本上,然后在Office 2013 + FileSite 9.0.6版本上。也许在你的测试工具中显示一些你的工作? – fivetoniner