2016-12-15 53 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