Как обойти ограничения iManage в надстройке Excel VSTO
Мы разработали надстройку VSTO для Excel, которая извлекает листы Excel с веб-сервера и позволяет пользователям манипулировать данными на листе. Он работает с локальной копией файла, но нас это не волнует. Но у некоторых из наших клиентов также установлена "iManage Integration для Office", и эти клиенты ведут себя странно. В этой среде мы не можем отменить событие Close.
Более конкретно, если пользователь открывает один из наших файлов и вносит изменения, а затем закрывает файл, наш обработчик событий запускает их и предлагает сохранить изменения (в данные на сервере). Если они выбирают "Отмена", или если они выбирают "Сохранить", и сохранение по какой-то причине не удается, мы устанавливаем "Отмена = true", чтобы сохранить файл открытым. Обычно это работает отлично.
Для тех клиентов с iManage файл закрывается в любом случае. Если наш код сохранил локальную копию файла, то файл просто закрывается. Если локальная копия не была сохранена, после iManage пользователь получает еще один запрос, запрашивающий, хотят ли они сохранить файл. Отсюда пользователь может нажать Отмена, и файл останется открытым. Но пользователи сообщают, что сложно увидеть второе приглашение после нажатия кнопки "Отмена" на первом. И они не хотят отключать надстройку iManage. Мы бы хотели, чтобы в этом случае файл оставался открытым, желательно не видеть подсказку iManage.
Работая в тестовой среде, настроенной для меня (Excel 2010), я попробовал несколько вещей:
- Я попытался установить Отмена на уровне рабочей книги BeforeClose и на уровне приложения WorkbookBeforeClose; ни один из них не работал (файл все еще закрывается при включении iManage)
- Я попытался убедиться, что мой обработчик для WorkbookBeforeClose зарегистрирован последним, зарегистрировав его в обработчике событий уровня книги; без изменений
- Я могу использовать ленту iManage, чтобы вручную переключиться в локальный режим, который заставляет все работать, но я не знаю, смогу ли я сделать это с помощью кода.
- Я могу найти надстройку iManage в Globals.ThisAddIn.Application.COMAddIns; Я попытался установить его Connect = false, но это дает ошибку в том смысле, что только администратор может подключить / отключить надстройку.
- Я могу сохранить локальный файл во время события закрытия, затем сделать SaveAs, чтобы создать вторую копию; вторая копия теперь активна, и iManage закрывает ее; затем я снова открываю исходный локальный файл. Это выглядит довольно хорошо для пользователя, но тогда у меня есть куча COM-ссылок на ячейки старого файла, и все это мусор. Я, вероятно, могу просмотреть их и сериализовать, а затем воссоздать их с новым файлом, но для написания кода и запуска потребуется много времени, поэтому сначала я ищу другие идеи.
Есть ли способ сохранить файл открытым, не заставляя пользователей делать что-то лишнее?
ОБНОВИТЬ
Используя iManage 9.3.0.0 и Excel 2010, я создал макрос VBA со ссылкой на библиотеку интерфейсов интеграции рабочих мест (Ex). Событие запускается, но файл все еще закрывается. Если я не установил свойство 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 ответ
Вам не нужно отключать надстройку интеграции iManage для Office. Ваше приложение должно обнаружить наличие надстройки интеграции iManage и затем обработать собственное эквивалентное событие Close этой надстройки
Для этого сначала получите экземпляр надстройки iManage, изучив коллекцию Excel Application.COMAddins и получив обратно экземпляр надстройки COM с идентификатором ProgID: WorkSiteOffice2003Addins.Connect
(Excel 2003 или более ранняя версия) или WorkSiteOffice2007Addins.Connect
(Excel 2007 или более поздняя версия).
На самом деле также должна быть установлена так называемая надстройка "обратной совместимости", также зарегистрированная с ProgID oUR02k.Connect
который вы можете ссылаться вместо этого. Опять же, установлен ли он или нет, зависит в некоторой степени от версии FileSite/DeskSite, которая установлена на компьютере.
Однако все это может показаться странным, потому что надстройки менялись с годами, поэтому это скорее зависит от того, сколько лет клиенту iManage (т.е. FileSite, DeskSite), а также от версии Office, на которую вы ориентируетесь. Возможно, вам придется компенсировать различные версии клиента Excel/iManage в вашем коде
Если у вас есть правильная ссылка на надстройку COM, проверьте COMAddin.Object
имущество. Это значение представляет экземпляр надстройки интеграции iManage Office
Оттуда вы можете привести этот объект к строго типизированному COM-интерфейсу iManageExtensibility
После этого вы сможете подключиться ко всем событиям приложения Office, которые угнали iManage (так же, как вы делали это в своем приложении), и реагировать на эти события, а не на собственные события Excel.
В вашем случае вам нужно будет следить за DocumentBeforeClose2
событие. Обратите внимание на символ "2" в конце. Существует также устаревшее событие с именем DocumentBeforeClose
но новее DocumentBeforeClose2
имеет следующую сигнатуру метода:
DocumentBeforeClose2(object doc, ref bool ignoreimanageclose, ref bool cancel)
Наконец, в вашем DocumentBeforeClose2
Обработчик событий добавляет вашу бизнес-логику для отмены события закрытия и / или события закрытия iManage. Вы делаете это, устанавливая ignoreimanageclose
и / или cancel
Логическое значение true/false в зависимости от ситуации. doc
параметром в этом случае будет экземпляр книги Excel, так что вы можете спокойно привести его к Excel.Workbook
интерфейс, если вы хотите
PS: если вы разрабатываете с использованием API-интерфейсов iManage и вам требуется поддержка, вам следует подумать о приобретении iManage SDK. Этот SDK содержит справку по различным API, образцам кода, и, я считаю, что он дает вам доступ к некоторой поддержке разработчиков.