我們已經開發了一個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