如何在Excel VSTO插件中解决iManage限制

我们开发了一个Excel的VSTO插件,它从Web服务器拉取Excel表格,并允许用户操纵表单上的数据。 它与本地文件的副本一起工作,但我们并不真正关心这个副本。 但是,我们的一些客户也安装了“iManage Integration for Office”,这些客户经历了奇怪的行为。 在这种环境下,我们无法取消closures事件。

更具体地说,如果用户打开我们的文件之一并进行更改,然后closures文件,我们的事件处理程序会触发并提示它们保存对服务器上数据的更改。 如果他们select“取消”,或者如果他们select“保存”,并且由于某种原因保存失败,则我们将取消设置为“true”,以尝试保持文件处于打开状态。 通常这是完美的。

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

在为我设置的客户端(Excel 2010)的testing环境中工作时,我尝试了几件事情:

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

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

UPDATE

使用iManage 9.3.0.0和Excel 2010,我创build了一个参考Worksite Integration Interfaces Library(Ex)的VBAmacros。 事件发生,但文件仍然closures。 如果我没有设置Saved属性,并且在网格上input,我总是会收到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 

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

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

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

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

一旦你有正确的COM加载项引用,请检查COMAddin.Object属性。 该值表示iManage Office集成加载项的实例

从那里你可以将该对象iManageExtensibilitytypesiManageExtensibility COM接口

然后,您就可以与iManage劫持的所有Office应用程序事件挂钩(很像您在应用程序中所做的事情),并响应这些事件而不是本机Excel事件。

在你的情况下,你将需要监视DocumentBeforeClose2事件。 注意结尾处的字符“2”。 还有一个名为DocumentBeforeClose的旧事件,但较新的DocumentBeforeClose2具有以下方法签名:

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

最后,在您的DocumentBeforeClose2事件处理程序中,添加您的业务逻辑以取消closures事件和/或iManageclosures事件。 您可以通过设置ignoreimanageclose和/或cancel布尔值为true / false。 在这种情况下, doc参数将是Excel工作簿实例,所以如果您愿意,您可以安全地将其转换到Excel.Workbook界面

PS:如果您针对iManage API进行开发并需要支持,则应考虑购买iManage SDK。 该SDK包含各种API,代码示例的帮助,关键是我相信它可以访问一些开发支持。