using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; /* * Класс - приемник события Excel * * Автор: Rovshan Gasanov, * PFSoft * Днепропетровск, * УКРАИНА. * * Данный класс позволяет организовать прием событий из MS Excel. * Для работы необходимо создать эксемпляр класса, объявить обработчики событий * и вызвать метод Connect(). * Для отключения необходимо вызвать метод Dispose(); * * Внимание! Данный код поставляется как есть. Вы можете использовать его в своих * приложениях, модифицировать исходный код. Автор не несет никакой ответственности за * ошибки и сбои, потерю данных и прочие возможные последствия использования данного кода. */ namespace PFSoft.ExcelInterop { #region// Managed версия COM интерфейса Excel [ComImport, Guid("00024413-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(0x1010)] public interface AppEvents { [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x61d)] void NewWorkbook([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x616)] void SheetSelectionChange([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x617)] void SheetBeforeDoubleClick([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target, [In] ref bool Cancel); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(1560)] void SheetBeforeRightClick([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target, [In] ref bool Cancel); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x619)] void SheetActivate([In, MarshalAs(UnmanagedType.IDispatch)] object Sh); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x61a)] void SheetDeactivate([In, MarshalAs(UnmanagedType.IDispatch)] object Sh); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x61b)] void SheetCalculate([In, MarshalAs(UnmanagedType.IDispatch)] object Sh); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x61c)] void SheetChange([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x61f)] void WorkbookOpen([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x620)] void WorkbookActivate([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x621)] void WorkbookDeactivate([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(1570)] void WorkbookBeforeClose([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In] ref bool Cancel); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x623)] void WorkbookBeforeSave([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In] bool SaveAsUI, [In] ref bool Cancel); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x624)] void WorkbookBeforePrint([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In] ref bool Cancel); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x625)] void WorkbookNewSheet([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.IDispatch)] object Sh); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x626)] void WorkbookAddinInstall([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x627)] void WorkbookAddinUninstall([In, MarshalAs(UnmanagedType.Interface)] object Wb); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x612)] void WindowResize([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.Interface)] object Wn); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x614)] void WindowActivate([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.Interface)] object Wn); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x615)] void WindowDeactivate([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.Interface)] object Wn); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x73e)] void SheetFollowHyperlink([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x86d)] void SheetPivotTableUpdate([In, MarshalAs(UnmanagedType.IDispatch)] object Sh, [In, MarshalAs(UnmanagedType.Interface)] object Target); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(2160)] void WorkbookPivotTableCloseConnection([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.Interface)] object Target); [PreserveSig, MethodImpl(MethodImplOptions.InternalCall), DispId(0x871)] void WorkbookPivotTableOpenConnection([In, MarshalAs(UnmanagedType.Interface)] object Wb, [In, MarshalAs(UnmanagedType.Interface)] object Target); } #endregion #region// Класс-провайдер событий Экселя /// /// Провайдер событий Excel /// [TypeLibType(0x10), ClassInterface((short)0)] public class ExcelEventsProvider : AppEvents, IDisposable { #region// Обработчики событий Excel (Реализация интерфейса AppEvents). /*Данные методы вызываются самим Excel. При этом в качестве параметров * они получают ссылки на различные COM-объекты Excel. Для того, чтобы * обратиться к методам и свойствам этох объектов * необходимо использовать позднее связывание, объект Type и метод InvokeMember * Более подробное описание событий и аргументов событий можно найти в MSDN и в документации * по Ms Visual Basic For Excel */ /// /// Происходит при добавлении новой книги в коллекцию книг. /// В качестве параметра передается ссылка на объект-книгу /// /// public virtual void NewWorkbook(object sender) { // Получение локальной копии ссылки на обработчик события NewWorkbookDelegate newWorkbookEventHandler = null; lock(this) newWorkbookEventHandler = _newWorkbookDelegate; // Вызов обработчика по локальной ссылке if(newWorkbookEventHandler!=null) newWorkbookEventHandler(sender); } /// /// Происходит при получении страницей фокуса /// /// public virtual void SheetActivate(object sender) { // Получение локальной копии ссылки на обработчик события SheetActivateDelegate sheetActivateEventHandler = null; lock(this) sheetActivateEventHandler = _sheetActivateDelegate; // Вызов обработчика по локальной ссылке if(sheetActivateEventHandler!=null) sheetActivateEventHandler(sender); } /// /// Происходит перед обработкой Excel двойного щелчка по странице. /// /// Ссылка на страницу /// Ссылка на ячейку /// Возвращаемый параметр. Если установить в true, то Excel не /// будет обрабатывать двойной клик public virtual void SheetBeforeDoubleClick(object sender, object Range, ref bool Cancel) { // Получение локальной копии ссылки на обработчик события SheetBeforeDoubleClickDelegate sheetBeforeDoubleClickEventHandler = null; lock(this) sheetBeforeDoubleClickEventHandler = _sheetBeforeDoubleClickDelegate; // Вызов обработчика по локальной ссылке if(sheetBeforeDoubleClickEventHandler!=null) sheetBeforeDoubleClickEventHandler(sender, Range, ref Cancel); } /// /// Происходит перед обработкой Excel щелчка правой кнопкой мыши по странице. /// /// Ссылка на страницу /// Ссылка на объект Range, описывающий ячейку /// Возвращаемый параметр. Если установить в true, то Excel не /// будет обрабатывать клик правой кнопкой public virtual void SheetBeforeRightClick(object sender, object Range, ref bool Cancel) { // Получение локальной копии ссылки на обработчик события SheetBeforeRightClickDelegate sheetBeforeRightClickEventHandler = null; lock(this) sheetBeforeRightClickEventHandler = _sheetBeforeRightClickDelegate; // Вызов обработчика по локальной ссылке if(sheetBeforeRightClickEventHandler!=null) sheetBeforeRightClickEventHandler(sender, Range, ref Cancel); } /// /// Происходит при пересчете страницы. В качетсве параметра передается ссылка /// на страницу, на которой произошел пересчет /// /// Ссылка на страницу, на которой произошел пересчет public virtual void SheetCalculate(object sender) { // Получение локальной копии ссылки на обработчик события SheetCalculateDelegate sheetCalculateEventHandler = null; lock(this) sheetCalculateEventHandler = _sheetCalculateDelegate; // Вызов обработчика по локальной ссылке if(sheetCalculateEventHandler!=null) sheetCalculateEventHandler(sender); } /// /// Происходит при изменении значения в ячейке на странице. В качетстве параметра получает ссылку /// на страницу, на которой произошло изменение, и объект Range, описывающий измененные ячейки /// /// Страница, на которой произошели изменения /// Объект Range, описывающий диапазон ячеек, значения которых изменились public virtual void SheetChange(object sender, object Range) { // Получение локальной копии ссылки на обработчик события SheetChangeDelegate sheetChangeEventHandler = null; lock(this) sheetChangeEventHandler = _sheetChangeDelegate; // Вызов обработчика по локальной ссылке if(sheetChangeEventHandler!=null) sheetChangeEventHandler(sender, Range); } /// /// Происходит при потере страницей фокуса. В качетсве параметра получает ссылку на страницу, /// которая потеряла фокус /// /// Страница, которая потеряла фокус public virtual void SheetDeactivate(object sender) { // Получение локальной копии ссылки на обработчик события SheetDeactivateDelegate sheetDeactivateEventHandler = null; lock(this) sheetDeactivateEventHandler = _sheetDeactivateDelegate; // Вызов обработчика по локальной ссылке if(sheetDeactivateEventHandler!=null) sheetDeactivateEventHandler(sender); } /// /// Происходит при переходе по гиперссылке. В качестве параметров /// получает ссылку на страницу и объект, описывающий гиперссылку /// /// /// public virtual void SheetFollowHyperlink(object sender, object Hyperlink) { // Получение локальной копии ссылки на обработчик события SheetFollowHyperlinkDelegate sheetFollowHyperlinkEventHandler = null; lock(this) sheetFollowHyperlinkEventHandler = _sheetFollowHyperlinkDelegate; // Вызов обработчика по локальной ссылке if(sheetFollowHyperlinkEventHandler!=null) sheetFollowHyperlinkEventHandler(sender, Hyperlink); } /// /// Происходит при обновленях в сводной таблице /// /// /// public virtual void SheetPivotTableUpdate(object sender, object PivotTable) { // Получение локальной копии ссылки на обработчик события SheetPivotTableUpdateDelegate sheetPivotTableUpdateEventHandler = null; lock(this) sheetPivotTableUpdateEventHandler = _sheetPivotTableUpdateDelegate; // Вызов обработчика по локальной ссылке if(sheetPivotTableUpdateEventHandler!=null) sheetPivotTableUpdateEventHandler(sender, PivotTable); } /// /// Происходит при изменении выделенной области на странице. /// В качетсве параметров передаются ссылки на страницу /// и объект Range, который описывает новое выделение. /// /// /// public virtual void SheetSelectionChange(object sender, object Range) { // Получение локальной копии ссылки на обработчик события SheetSelectionChangeDelegate sheetSelectionChangeEventHandler = null; lock(this) sheetSelectionChangeEventHandler = _sheetSelectionChangeDelegate; // Вызов обработчика по локальной ссылке if(sheetSelectionChangeEventHandler!=null) sheetSelectionChangeEventHandler(sender, Range); } /// /// Происходит при получении окном книги фокуса /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowActivate(object Workbook, object Window) { // Получение локальной копии ссылки на обработчик события WindowActivateDelegate windowActivateEventHandler = null; lock(this) windowActivateEventHandler = _windowActivateDelegate; // Вызов обработчика по локальной ссылке if(windowActivateEventHandler!=null) windowActivateEventHandler(Workbook, Window); } /// /// Происходит при потере окном книги фокуса /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowDeactivate(object Workbook, object Window) { // Получение локальной копии ссылки на обработчик события WindowDeactivateDelegate windowDeactivateEventHandler = null; lock(this) windowDeactivateEventHandler = _windowDeactivateDelegate; // Вызов обработчика по локальной ссылке if(windowDeactivateEventHandler!=null) windowDeactivateEventHandler(Workbook, Window); } /// /// Происходит при изменении размеров окна рабочей книги /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowResize(object Workbook, object Window) { // Получение локальной копии ссылки на обработчик события WindowResizeDelegate windowResizeEventHandler = null; lock(this) windowResizeEventHandler = _windowResizeDelegate; // Вызов обработчика по локальной ссылке if(windowResizeEventHandler!=null) windowResizeEventHandler(Workbook, Window); } /// /// Происходит при получении книгой фокуса /// /// ССылка на книгу public virtual void WorkbookActivate(object Workbook) { // Получение локальной копии ссылки на обработчик события WorkbookActivateDelegate workbookActivateEventHandler = null; lock(this) workbookActivateEventHandler = _workbookActivateDelegate; // Вызов обработчика по локальной ссылке if(workbookActivateEventHandler!=null) workbookActivateEventHandler(Workbook); } /// /// Происходит про установке модулей расширения /// /// public virtual void WorkbookAddinInstall(object Workbook) { // Получение локальной копии ссылки на обработчик события WorkbookAddinInstallDelegate workbookAddinInstallEventHandler = null; lock(this) workbookAddinInstallEventHandler = _workbookAddinInstallDelegate; // Вызов обработчика по локальной ссылке if(workbookAddinInstallEventHandler!=null) workbookAddinInstallEventHandler(Workbook); } /// /// Происходит при удалении модулей расширения. /// /// public virtual void WorkbookAddinUninstall(object Workbook) { // Получение локальной копии ссылки на обработчик события WorkbookAddinUninstallDelegate workbookAddinUninstallEventHandler = null; lock(this) workbookAddinUninstallEventHandler = _workbookAddinUninstallDelegate; // Вызов обработчика по локальной ссылке if(workbookAddinUninstallEventHandler!=null) workbookAddinUninstallEventHandler(Workbook); } /// /// Происходит перед закрытием книги. В качетсве параметра /// получает ссылку на книгу и возвращаемый параметр Cancel. /// Если установить Cancel d true, то операция закрытия книги будет отменена /// /// Ссылка на рабочую книгу /// Возвращаемый параметр. Установка в true отменяет закрытие книги public virtual void WorkbookBeforeClose(object Workbook, ref bool Cancel) { // Получение локальной копии ссылки на обработчик события WorkbookBeforeCloseDelegate workbookBeforeCloseEventHandler = null; lock(this) workbookBeforeCloseEventHandler = _workbookBeforeCloseDelegate; // Вызов обработчика по локальной ссылке if(workbookBeforeCloseEventHandler!=null) workbookBeforeCloseEventHandler(Workbook, ref Cancel); } /// /// Происходит перед запуском книги на печать. В качетсве параметра получает ссылку на книгу и /// возвращаемый параметр, установка которого в true отменяет печать /// /// Ссылка на рабочую книгу /// public virtual void WorkbookBeforePrint(object Workbook, ref bool Cancel) { // Получение локальной копии ссылки на обработчик события WorkbookBeforePrintDelegate workbookBeforePrintEventHandler = null; lock(this) workbookBeforePrintEventHandler = _workbookBeforePrintDelegate; // Вызов обработчика по локальной ссылке if(workbookBeforePrintEventHandler!=null) workbookBeforePrintEventHandler(Workbook, ref Cancel); } /// /// Происходит перед сохранением книги. В качетсве параметров принимает ссылку на рабочую книгу, /// флаг, разрешающий отмену операции сохранения (установку параметра Cancel). Установка параметра /// Cancel в true отменяет сохранение рабочей книги. /// /// Ссылка на сохраняемую книгу /// /// public virtual void WorkbookBeforeSave(object Workbook, bool save, ref bool Cancel) { // Получение локальной копии ссылки на обработчик события WorkbookBeforeSaveDelegate workbookBeforeSaveEventHandler = null; lock(this) workbookBeforeSaveEventHandler = _workbookBeforeSaveDelegate; // Вызов обработчика по локальной ссылке if(workbookBeforeSaveEventHandler!=null) workbookBeforeSaveEventHandler(Workbook, save, ref Cancel); } /// /// Происходит при потере книгой фокуса. В качетсве параметра /// передается ссылка на рабочую книгу. /// /// public virtual void WorkbookDeactivate(object Workbook) { // Получение локальной копии ссылки на обработчик события WorkbookDeactivateDelegate workbookDeactivateEventHandler = null; lock(this) workbookDeactivateEventHandler = _workbookDeactivateDelegate; // Вызов обработчика по локальной ссылке if(workbookDeactivateEventHandler!=null) workbookDeactivateEventHandler(Workbook); } /// /// Происходит при добавлении новой страницы в рабочую книгу. /// /// /// public virtual void WorkbookNewSheet(object Workbook, object sheet) { // Получение локальной копии ссылки на обработчик события WorkbookNewSheetDelegate workbookNewSheetEventHandler = null; lock(this) workbookNewSheetEventHandler = _workbookNewSheetDelegate; // Вызов обработчика по локальной ссылке if(workbookNewSheetEventHandler!=null) workbookNewSheetEventHandler(Workbook, sheet); } /// /// Происходит при открытии рабочей книги. /// /// public virtual void WorkbookOpen(object Workbook) { // Получение локальной копии ссылки на обработчик события WorkbookOpenDelegate workbookOpenEventHandler = null; lock(this) workbookOpenEventHandler = _workbookOpenDelegate; // Вызов обработчика по локальной ссылке if(workbookOpenEventHandler!=null) workbookOpenEventHandler(Workbook); } /// /// Происходит при отключении сводной таблицы от источника данных /// /// /// public virtual void WorkbookPivotTableCloseConnection(object Workbook, object PivotTable) { // Получение локальной копии ссылки на обработчик события WorkbookPivotTableCloseConnectionDelegate workbookPivotTableCloseConnectionEventHandler = null; lock(this) workbookPivotTableCloseConnectionEventHandler = _workbookPivotTableCloseConnectionDelegate; // Вызов обработчика по локальной ссылке if(workbookPivotTableCloseConnectionEventHandler!=null) workbookPivotTableCloseConnectionEventHandler(Workbook, PivotTable); } /// /// Происходит при подключении сводной таблицы к источнику данных /// /// /// public virtual void WorkbookPivotTableOpenConnection(object Workbook, object PivotTable) { // Получение локальной копии ссылки на обработчик события WorkbookPivotTableOpenConnectionDelegate workbookPivotTableOpenConnectionEventHandler = null; lock(this) workbookPivotTableOpenConnectionEventHandler = _workbookPivotTableOpenConnectionDelegate; // Вызов обработчика по локальной ссылке if(workbookPivotTableOpenConnectionEventHandler!=null) workbookPivotTableOpenConnectionEventHandler(Workbook, PivotTable); } #endregion #region // Делегаты событий private NewWorkbookDelegate _newWorkbookDelegate; private SheetActivateDelegate _sheetActivateDelegate; private SheetBeforeDoubleClickDelegate _sheetBeforeDoubleClickDelegate; private SheetBeforeRightClickDelegate _sheetBeforeRightClickDelegate; private SheetCalculateDelegate _sheetCalculateDelegate; private SheetChangeDelegate _sheetChangeDelegate; private SheetDeactivateDelegate _sheetDeactivateDelegate; private SheetFollowHyperlinkDelegate _sheetFollowHyperlinkDelegate; private SheetPivotTableUpdateDelegate _sheetPivotTableUpdateDelegate; private SheetSelectionChangeDelegate _sheetSelectionChangeDelegate; private WindowActivateDelegate _windowActivateDelegate; private WindowDeactivateDelegate _windowDeactivateDelegate; private WindowResizeDelegate _windowResizeDelegate; private WorkbookActivateDelegate _workbookActivateDelegate; private WorkbookAddinInstallDelegate _workbookAddinInstallDelegate; private WorkbookAddinUninstallDelegate _workbookAddinUninstallDelegate; private WorkbookBeforeCloseDelegate _workbookBeforeCloseDelegate; private WorkbookBeforePrintDelegate _workbookBeforePrintDelegate; private WorkbookBeforeSaveDelegate _workbookBeforeSaveDelegate; private WorkbookDeactivateDelegate _workbookDeactivateDelegate; private WorkbookNewSheetDelegate _workbookNewSheetDelegate; private WorkbookOpenDelegate _workbookOpenDelegate; private WorkbookPivotTableCloseConnectionDelegate _workbookPivotTableCloseConnectionDelegate; private WorkbookPivotTableOpenConnectionDelegate _workbookPivotTableOpenConnectionDelegate; #endregion #region// События /// /// Происходит при создании новой кники /// public event NewWorkbookDelegate OnNewWorkbook { add { lock(this) _newWorkbookDelegate += value; } remove { lock(this) { if (_newWorkbookDelegate!=null) _newWorkbookDelegate -= value; } } } /// /// Происходит при активации страницы /// public event SheetActivateDelegate OnSheetActivate { add { lock(this) _sheetActivateDelegate += value; } remove { lock(this) { if (_sheetActivateDelegate !=null) _sheetActivateDelegate -= value; } } } /// /// Происходит перед обработкой Excel двойного клика по странице /// public event SheetBeforeDoubleClickDelegate OnSheetBeforeDoubleClick { add { lock(this) _sheetBeforeDoubleClickDelegate += value; } remove { lock(this) { if (_sheetBeforeDoubleClickDelegate !=null) _sheetBeforeDoubleClickDelegate -= value; } } } /// /// Происходит перед обработкой Excel правого клика по странице /// public event SheetBeforeRightClickDelegate OnSheetBeforeRightClick { add { lock(this) _sheetBeforeRightClickDelegate += value; } remove { lock(this) { if (_sheetBeforeRightClickDelegate !=null) _sheetBeforeRightClickDelegate -= value; } } } /// /// Происходит при пересчете страницы /// public event SheetCalculateDelegate OnSheetCalculate { add { lock(this) _sheetCalculateDelegate += value; } remove { lock(this) { if (_sheetCalculateDelegate !=null) _sheetCalculateDelegate -= value; } } } /// /// Приисходит при изменении содержимого какой-либо ячейки. При этом /// это событие не происходит при изменении значения в ячейке, связанного с расчетом /// формулы /// public event SheetChangeDelegate OnSheetChange { add { lock(this) _sheetChangeDelegate += value; } remove { lock(this) { if (_sheetChangeDelegate !=null) _sheetChangeDelegate -= value; } } } /// /// Происходит при потере страницей фокуса /// public event SheetDeactivateDelegate OnSheetDeactivate { add { lock(this) _sheetDeactivateDelegate += value; } remove { lock(this) { if (_sheetDeactivateDelegate !=null) _sheetDeactivateDelegate -= value; } } } /// /// Происходит при переходе по гиперссылке /// public event SheetFollowHyperlinkDelegate OnSheetFollowHyperlink { add { lock(this) _sheetFollowHyperlinkDelegate += value; } remove { lock(this) { if (_sheetFollowHyperlinkDelegate !=null) _sheetFollowHyperlinkDelegate -= value; } } } /// /// Происходит при обновлении данных в сводной таблице /// public event SheetPivotTableUpdateDelegate OnSheetPivotTableUpdate { add { lock(this) _sheetPivotTableUpdateDelegate += value; } remove { lock(this) { if (_sheetPivotTableUpdateDelegate !=null) _sheetPivotTableUpdateDelegate -= value; } } } /// /// Происходит при изменении выделенной области на странице /// public event SheetSelectionChangeDelegate OnSheetSelectionChange { add { lock(this) _sheetSelectionChangeDelegate += value; } remove { lock(this) { if (_sheetSelectionChangeDelegate !=null) _sheetSelectionChangeDelegate -= value; } } } /// /// Происходит при активации окна /// public event WindowActivateDelegate OnWindowActivate { add { lock(this) _windowActivateDelegate += value; } remove { lock(this) { if (_windowActivateDelegate !=null) _windowActivateDelegate -= value; } } } /// /// Происходит при потере окном фокуса /// public event WindowDeactivateDelegate OnWindowDeactivate { add { lock(this) _windowDeactivateDelegate += value; } remove { lock(this) { if (_windowDeactivateDelegate !=null) _windowDeactivateDelegate -= value; } } } /// /// Происходит при изменении окном своего размера /// public event WindowResizeDelegate OnWindowResize { add { lock(this) _windowResizeDelegate += value; } remove { lock(this) { if (_windowResizeDelegate !=null) _windowResizeDelegate -= value; } } } /// /// Происходит при получении книгий фокуса /// public event WorkbookActivateDelegate OnWorkbookActivate { add { lock(this) _workbookActivateDelegate += value; } remove { lock(this) { if (_workbookActivateDelegate !=null) _workbookActivateDelegate -= value; } } } /// /// Происходит при добавлении модуля расширения /// public event WorkbookAddinInstallDelegate OnWorkbookAddinInstall { add { lock(this) _workbookAddinInstallDelegate += value; } remove { lock(this) { if (_workbookAddinInstallDelegate !=null) _workbookAddinInstallDelegate -= value; } } } /// /// Происходит при отключении модуля расширения /// public event WorkbookAddinUninstallDelegate OnWorkbookAddinUninstall { add { lock(this) _workbookAddinUninstallDelegate += value; } remove { lock(this) { if (_workbookAddinUninstallDelegate !=null) _workbookAddinUninstallDelegate -= value; } } } /// /// Происходит перед закрытием книги /// public event WorkbookBeforeCloseDelegate OnWorkbookBeforeClose { add { lock(this) _workbookBeforeCloseDelegate += value; } remove { lock(this) { if (_workbookBeforeCloseDelegate !=null) _workbookBeforeCloseDelegate -= value; } } } /// /// Происходит перед печатью книги /// public event WorkbookBeforePrintDelegate OnWorkbookBeforePrint { add { lock(this) _workbookBeforePrintDelegate += value; } remove { lock(this) { if (_workbookBeforePrintDelegate !=null) _workbookBeforePrintDelegate -= value; } } } /// /// Происходит перед сохранением книги /// public event WorkbookBeforeSaveDelegate OnWorkbookBeforeSave { add { lock(this) _workbookBeforeSaveDelegate += value; } remove { lock(this) { if (_workbookBeforeSaveDelegate !=null) _workbookBeforeSaveDelegate -= value; } } } /// /// Происходит при потере книгой фокуса /// public event WorkbookDeactivateDelegate OnWorkbookDeactivate { add { lock(this) _workbookDeactivateDelegate += value; } remove { lock(this) { if (_workbookDeactivateDelegate !=null) _workbookDeactivateDelegate -= value; } } } /// /// Происходит при добавлении новой страницы /// public event WorkbookNewSheetDelegate OnWorkbookNewSheet { add { lock(this) _workbookNewSheetDelegate += value; } remove { lock(this) { if (_workbookNewSheetDelegate !=null) _workbookNewSheetDelegate -= value; } } } /// /// Происходит при открытии книги /// public event WorkbookOpenDelegate OnWorkbookOpen { add { lock(this) _workbookOpenDelegate += value; } remove { lock(this) { if (_workbookOpenDelegate !=null) _workbookOpenDelegate -= value; } } } /// /// Происходит при отключении сводной таблицы от источника данных /// public event WorkbookPivotTableCloseConnectionDelegate OnWorkbookPivotTableCloseConnection { add { lock(this) _workbookPivotTableCloseConnectionDelegate += value; } remove { lock(this) { if (_workbookPivotTableCloseConnectionDelegate !=null) _workbookPivotTableCloseConnectionDelegate -= value; } } } /// /// Происходит про подключении сводной таблицы к источнику данных /// public event WorkbookPivotTableOpenConnectionDelegate OnWorkbookPivotTableOpenConnection { add { lock(this) _workbookPivotTableOpenConnectionDelegate += value; } remove { lock(this) { if (_workbookPivotTableOpenConnectionDelegate !=null) _workbookPivotTableOpenConnectionDelegate -= value; } } } #endregion #region// Создание, подключение и завершение /// /// Ссылка на интерфейс IConnectionPointContainer /// private UCOMIConnectionPointContainer _icpc = null; /// /// Ссылка на интерфейс IConnectionPoint /// private UCOMIConnectionPoint _icp = null; /// /// Идентификатор объекта в точке подключения /// private int _cookie = 0; /// /// Ссылка на объект Excel /// object _excel = null; /// /// Признак того, что объект "завершен" /// private bool _disposed = false; /// /// Подключение к Excel /// public bool Connect() { try { // Получаем ссылку на Excel _excel = Marshal.GetActiveObject("Excel.Application"); // Получаем ссылку на интерфейс IConnectionPointContainer _icpc = (UCOMIConnectionPointContainer)_excel; // Получаем ссылку на "точку подключения" Guid guid = new Guid("00024413-0000-0000-C000-000000000046"); _icpc.FindConnectionPoint(ref guid, out _icp); // Регистрируем себя в точке подключения и сохраняем идентификатор cookie _icp.Advise(this, out _cookie); // Возвращаем результат - нормальное подключение _disposed = false; return true; } catch(Exception ex) { //Что-то произошло - освобождаем ресурсы Dispose(); // Заверщаем метод return false; } } /// /// Отключение от Excel /// public void Dispose() { // Проверяем признак "завершенности" объекта if(!_disposed) { // Отписываемся от событий try { _icp.Unadvise(_cookie); } catch(Exception ex) { } // Завершаем COM объект Excel try { Marshal.ReleaseComObject(_excel); } catch(Exception ex) { } // Очищаем память GC.GetTotalMemory(true); // Устанавливаем флаг - объект "завершен" _disposed = true; // Подавляем вызов деструктора GC.SuppressFinalize(this); } } public ExcelEventsProvider() { } ~ExcelEventsProvider() { Dispose(); } #endregion } #endregion #region// Делегаты public delegate void NewWorkbookDelegate(object sender); public delegate void SheetActivateDelegate(object sender); public delegate void SheetBeforeDoubleClickDelegate(object sender, object range, ref bool Cancel); public delegate void SheetBeforeRightClickDelegate(object sender, object range, ref bool Cancel); public delegate void SheetCalculateDelegate(object sender); public delegate void SheetChangeDelegate(object sender, object range); public delegate void SheetDeactivateDelegate(object sender); public delegate void SheetFollowHyperlinkDelegate(object sender, object hyperlink); public delegate void SheetPivotTableUpdateDelegate(object sender, object pivotTable); public delegate void SheetSelectionChangeDelegate(object sender, object range); public delegate void WindowActivateDelegate(object workbook, object window); public delegate void WindowDeactivateDelegate(object workbook, object window); public delegate void WindowResizeDelegate(object workbook, object window); public delegate void WorkbookActivateDelegate(object workbook); public delegate void WorkbookAddinInstallDelegate(object workbook); public delegate void WorkbookAddinUninstallDelegate(object workbook); public delegate void WorkbookBeforeCloseDelegate(object workbook, ref bool cancel); public delegate void WorkbookBeforePrintDelegate(object workbook, ref bool cancel); public delegate void WorkbookBeforeSaveDelegate(object workbook, bool save, ref bool cancel); public delegate void WorkbookDeactivateDelegate(object workbook); public delegate void WorkbookNewSheetDelegate(object workbook, object sheet); public delegate void WorkbookOpenDelegate(object workbook); public delegate void WorkbookPivotTableCloseConnectionDelegate(object workbook, object pivotTable); public delegate void WorkbookPivotTableOpenConnectionDelegate(object workbook, object pivotTable); #endregion }