我们已经开发了一个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
非常感谢这个详细的答案。我会尽快尝试。 – Mishelle
这没有奏效。我为com插件对象添加了DocumentBeforeClose2的事件处理程序,并在关闭文件时触发。将这些变量中的任何一个设置为true都没有效果 - 如果有未保存的更改,我会得到iManage提示,否则文件将关闭 – Mishelle
我无法为您的开发环境说话,但是我只是自己测试了一下,它完美地工作:I处理DocumentBeforeClose2事件,关闭未保存的文档,然后以编程方式将事件签名中的IgnoreManageClose和Cancel参数设置为True。结果是文档没有关闭。我跑了两次相同的测试:首先在Office 2016 + FileSite 9.3.1版本上,然后在Office 2013 + FileSite 9.0.6版本上。也许在你的测试工具中显示一些你的工作? – fivetoniner