using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Reflection; using System.Reflection.Emit; /* * Класс - приемник события Excel * * Автор: Rovshan Gasanov, * PFSoft * Днепропетровск, * УКРАИНА. * * Данный класс позволяет организовать прием событий из MS Excel. * Для работы необходимо создать эксемпляр класса, объявить обработчики событий * и вызвать метод Connect(). * Для отключения необходимо вызвать метод Dispose(); * * Внимание! Данный код поставляется как есть. Вы можете использовать его в своих * приложениях, модифицировать исходный код. Автор не несет никакой ответственности за * ошибки и сбои, потерю данных и прочие возможные последствия использования данного кода. */ namespace PFDS.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) { if(m_NewWorkbookDelegate!=null) m_NewWorkbookDelegate(sender); } /// /// Происходит при получении страницей фокуса /// /// public virtual void SheetActivate(object sender) { if(m_SheetActivateDelegate!=null) m_SheetActivateDelegate(sender); } /// /// Происходит перед обработкой Excel двойного клика по странице. /// /// Ссылка на страницу /// Ссылка на ячейку /// Возвращаемый параметр. Если установить в true, то Excel не /// будет обрабатывать двойной клик public virtual void SheetBeforeDoubleClick(object sender, object Range, ref bool Cancel) { if(m_SheetBeforeDoubleClickDelegate!=null) m_SheetBeforeDoubleClickDelegate(sender, Range, ref Cancel); } /// /// Происходит перед обработкой Excel щелчка правой кнопкой мыши по странице. /// /// Ссылка на страницу /// Ссылка на объект Range, описывающий ячейку /// Возвращаемый параметр. Если установить в true, то Excel не /// будет обрабатывать клик правой кнопкой public virtual void SheetBeforeRightClick(object sender, object Range, ref bool Cancel) { if(m_SheetBeforeRightClickDelegate!=null) m_SheetBeforeRightClickDelegate(sender, Range, ref Cancel); } /// /// Происходит при пересчете страницы. В качетсве параметра передается ссылка /// на страницу, на которой произошел пересчет /// /// Ссылка на страницу, на которой произошел пересчет public virtual void SheetCalculate(object sender) { if(m_SheetCalculateDelegate!=null) m_SheetCalculateDelegate(sender); } /// /// Происходит при изменении значения в ячейке на странице. В качетстве параметра получает ссылку /// на страницу, на которой произошло изменение, и объект Range, описывающий измененные ячейки /// /// Страница, на которой произошели изменения /// Объект Range, описывающий диапазон ячеек, значения которых изменились public virtual void SheetChange(object sender, object Range) { if(m_SheetChangeDelegate!=null) m_SheetChangeDelegate(sender, Range); } /// /// Происходит при потере страницей фокуса. В качетсве параметра получает ссылку на страницу, /// которая потеряла фокус /// /// Страница, которая потеряла фокус public virtual void SheetDeactivate(object sender) { if(m_SheetDeactivateDelegate!=null) m_SheetDeactivateDelegate(sender); } /// /// Происходит при переходе по гиперссылке. В качестве параметров /// получает ссылку на страницу и объект, описывающий гиперссылку /// /// /// public virtual void SheetFollowHyperlink(object sender, object Hyperlink) { if(m_SheetFollowHyperlinkDelegate!=null) m_SheetFollowHyperlinkDelegate(sender, Hyperlink); } /// /// См. MSDN /// /// /// public virtual void SheetPivotTableUpdate(object sender, object PivotTable) { if(m_SheetPivotTableUpdateDelegate!=null) m_SheetPivotTableUpdateDelegate(sender, PivotTable); } /// /// Происходит при изменении выделенной области на странице. /// В качетсве параметров передаются ссылки на страницу /// и объект Range, который описывает новое выделение. /// /// /// public virtual void SheetSelectionChange(object sender, object Range) { if(m_SheetSelectionChangeDelegate!=null) m_SheetSelectionChangeDelegate(sender, Range); } /// /// Происходит при получении окном книги фокуса /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowActivate(object Workbook, object Window) { if(m_WindowActivateDelegate!=null) m_WindowActivateDelegate(Workbook, Window); } /// /// Происходит при потере окном книги фокуса /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowDeactivate(object Workbook, object Window) { if(m_WindowDeactivateDelegate!=null) m_WindowDeactivateDelegate(Workbook, Window); } /// /// Происходит при изменении размеров окна рабочей книги /// /// Ссылка на книгу /// Ссылка на окно книги public virtual void WindowResize(object Workbook, object Window) { if(m_WindowResizeDelegate!=null) m_WindowResizeDelegate(Workbook, Window); } /// /// Происходит при получении книгой фокуса /// /// ССылка на книгу public virtual void WorkbookActivate(object Workbook) { if(m_WorkbookActivateDelegate!=null) m_WorkbookActivateDelegate(Workbook); } public virtual void WorkbookAddinInstall(object Workbook) { if(m_WorkbookAddinInstallDelegate!=null) m_WorkbookAddinInstallDelegate(Workbook); } public virtual void WorkbookAddinUninstall(object Workbook) { if(m_WorkbookAddinUninstallDelegate!=null) m_WorkbookAddinUninstallDelegate(Workbook); } /// /// Происходит перед закрытием книги. В качетсве параметра /// получает ссылку на книгу и возвращаемый параметр Cancel. /// Если установить Cancel d true, то операция закрытия книги будет отменена /// /// Ссылка на рабочую книгу /// Возвращаемый параметр. Установка в true отменяет закрытие книги public virtual void WorkbookBeforeClose(object Workbook, ref bool Cancel) { if(m_WorkbookBeforeCloseDelegate!=null) m_WorkbookBeforeCloseDelegate(Workbook, ref Cancel); } /// /// Происходит перед запуском книги на печать. В качетсве параметра получает ссылку на книгу и /// возвращаемый параметр, установка которого в true отменяет печать /// /// Ссылка на рабочую книгу /// public virtual void WorkbookBeforePrint(object Workbook, ref bool Cancel) { if(m_WorkbookBeforePrintDelegate!=null) m_WorkbookBeforePrintDelegate(Workbook, ref Cancel); } /// /// Происходит перед сохранением книги. В качетсве параметров принимает ссылку на рабочую книгу, /// флаг, разрешающий отмену операции сохранения (установку параметра Cancel). Установка параметра /// Cancel в true отменяет сохранение рабочей книги. /// /// Ссылка на сохраняемую книгу /// /// public virtual void WorkbookBeforeSave(object Workbook, bool save, ref bool Cancel) { if(m_WorkbookBeforeSaveDelegate!=null) m_WorkbookBeforeSaveDelegate(Workbook, save, ref Cancel); } /// /// Происходит при потере книгой фокуса. В качетсве параметра /// передается ссылка на рабочую книгу. /// /// public virtual void WorkbookDeactivate(object Workbook) { if(m_WorkbookDeactivateDelegate!=null) m_WorkbookDeactivateDelegate(Workbook); } /// /// Происходит при добавлении новой страницы в рабочую книгу. /// /// /// public virtual void WorkbookNewSheet(object Workbook, object sheet) { if(m_WorkbookNewSheetDelegate!=null) m_WorkbookNewSheetDelegate(Workbook, sheet); } /// /// Происходит при открытии рабочей книги. /// /// public virtual void WorkbookOpen(object Workbook) { if(m_WorkbookOpenDelegate!=null) m_WorkbookOpenDelegate(Workbook); } /// /// См. Документацию /// /// /// public virtual void WorkbookPivotTableCloseConnection(object Workbook, object PivotTable) { if(m_WorkbookPivotTableCloseConnectionDelegate!=null) m_WorkbookPivotTableCloseConnectionDelegate(Workbook, PivotTable); } /// /// См. Документацию /// /// /// public virtual void WorkbookPivotTableOpenConnection(object Workbook, object PivotTable) { if(m_WorkbookPivotTableOpenConnectionDelegate!=null) m_WorkbookPivotTableOpenConnectionDelegate(Workbook, PivotTable); } #endregion #region // Делегаты событий private AppEvents_NewWorkbookEventHandler m_NewWorkbookDelegate; private AppEvents_SheetActivateEventHandler m_SheetActivateDelegate; private AppEvents_SheetBeforeDoubleClickEventHandler m_SheetBeforeDoubleClickDelegate; private AppEvents_SheetBeforeRightClickEventHandler m_SheetBeforeRightClickDelegate; private AppEvents_SheetCalculateEventHandler m_SheetCalculateDelegate; private AppEvents_SheetChangeEventHandler m_SheetChangeDelegate; private AppEvents_SheetDeactivateEventHandler m_SheetDeactivateDelegate; private AppEvents_SheetFollowHyperlinkEventHandler m_SheetFollowHyperlinkDelegate; private AppEvents_SheetPivotTableUpdateEventHandler m_SheetPivotTableUpdateDelegate; private AppEvents_SheetSelectionChangeEventHandler m_SheetSelectionChangeDelegate; private AppEvents_WindowActivateEventHandler m_WindowActivateDelegate; private AppEvents_WindowDeactivateEventHandler m_WindowDeactivateDelegate; private AppEvents_WindowResizeEventHandler m_WindowResizeDelegate; private AppEvents_WorkbookActivateEventHandler m_WorkbookActivateDelegate; private AppEvents_WorkbookAddinInstallEventHandler m_WorkbookAddinInstallDelegate; private AppEvents_WorkbookAddinUninstallEventHandler m_WorkbookAddinUninstallDelegate; private AppEvents_WorkbookBeforeCloseEventHandler m_WorkbookBeforeCloseDelegate; private AppEvents_WorkbookBeforePrintEventHandler m_WorkbookBeforePrintDelegate; private AppEvents_WorkbookBeforeSaveEventHandler m_WorkbookBeforeSaveDelegate; private AppEvents_WorkbookDeactivateEventHandler m_WorkbookDeactivateDelegate; private AppEvents_WorkbookNewSheetEventHandler m_WorkbookNewSheetDelegate; private AppEvents_WorkbookOpenEventHandler m_WorkbookOpenDelegate; private AppEvents_WorkbookPivotTableCloseConnectionEventHandler m_WorkbookPivotTableCloseConnectionDelegate; private AppEvents_WorkbookPivotTableOpenConnectionEventHandler m_WorkbookPivotTableOpenConnectionDelegate; #endregion #region// События /// /// Происходит при создании новой кники /// public event AppEvents_NewWorkbookEventHandler OnNewWorkbookDelegate { add { lock(this) m_NewWorkbookDelegate += value; } remove { lock(this) if (m_NewWorkbookDelegate!=null) m_NewWorkbookDelegate -= value; } } /// /// Происходит при активации страницы /// public event AppEvents_SheetActivateEventHandler OnSheetActivateDelegate { add { lock(this) m_SheetActivateDelegate += value; } remove { lock(this) if (m_SheetActivateDelegate !=null) m_SheetActivateDelegate -= value; } } /// /// Происходит перед обработкой Excel двойного клика по странице /// public event AppEvents_SheetBeforeDoubleClickEventHandler OnSheetBeforeDoubleClickDelegate { add { lock(this) m_SheetBeforeDoubleClickDelegate += value; } remove { lock(this) if (m_SheetBeforeDoubleClickDelegate !=null) m_SheetBeforeDoubleClickDelegate -= value; } } /// /// Происходит перед обработкой Excel правого клика по странице /// public event AppEvents_SheetBeforeRightClickEventHandler OnSheetBeforeRightClickDelegate { add { lock(this) m_SheetBeforeRightClickDelegate += value; } remove { lock(this) if (m_SheetBeforeRightClickDelegate !=null) m_SheetBeforeRightClickDelegate -= value; } } /// /// Происходит при пересчете страницы /// public event AppEvents_SheetCalculateEventHandler OnSheetCalculateDelegate { add { lock(this) m_SheetCalculateDelegate += value; } remove { lock(this) if (m_SheetCalculateDelegate !=null) m_SheetCalculateDelegate -= value; } } /// /// Приисходит при изменении содержимого какой-либо ячейки. При этом /// это событие не происходит при изменении значения в ячейке, связанного с расчетом /// формулы /// public event AppEvents_SheetChangeEventHandler OnSheetChangeDelegate { add { lock(this) m_SheetChangeDelegate += value; } remove { lock(this) if (m_SheetChangeDelegate !=null) m_SheetChangeDelegate -= value; } } /// /// Происходит при потере страницей фокуса /// public event AppEvents_SheetDeactivateEventHandler OnSheetDeactivateDelegate { add { lock(this) m_SheetDeactivateDelegate += value; } remove { lock(this) if (m_SheetDeactivateDelegate !=null) m_SheetDeactivateDelegate -= value; } } /// /// Происходит при переходе по гиперссылке /// public event AppEvents_SheetFollowHyperlinkEventHandler OnSheetFollowHyperlinkDelegate { add { lock(this) m_SheetFollowHyperlinkDelegate += value; } remove { lock(this) if (m_SheetFollowHyperlinkDelegate !=null) m_SheetFollowHyperlinkDelegate -= value; } } /// /// Происходит при ... (не помню, смотрите MSDN :) /// public event AppEvents_SheetPivotTableUpdateEventHandler OnSheetPivotTableUpdateDelegate { add { lock(this) m_SheetPivotTableUpdateDelegate += value; } remove { lock(this) if (m_SheetPivotTableUpdateDelegate !=null) m_SheetPivotTableUpdateDelegate -= value; } } /// /// Происходит при изменении выделенной области на странице /// public event AppEvents_SheetSelectionChangeEventHandler OnSheetSelectionChangeDelegate { add { lock(this) m_SheetSelectionChangeDelegate += value; } remove { lock(this) if (m_SheetSelectionChangeDelegate !=null) m_SheetSelectionChangeDelegate -= value; } } /// /// Происходит при активации окна /// public event AppEvents_WindowActivateEventHandler OnWindowActivateDelegate { add { lock(this) m_WindowActivateDelegate += value; } remove { lock(this) if (m_WindowActivateDelegate !=null) m_WindowActivateDelegate -= value; } } /// /// Происходит при потере окном фокуса /// public event AppEvents_WindowDeactivateEventHandler OnWindowDeactivateDelegate { add { lock(this) m_WindowDeactivateDelegate += value; } remove { lock(this) if (m_WindowDeactivateDelegate !=null) m_WindowDeactivateDelegate -= value; } } /// /// Происходит при изменении окном своего размера /// public event AppEvents_WindowResizeEventHandler OnWindowResizeDelegate { add { lock(this) m_WindowResizeDelegate += value; } remove { lock(this) if (m_WindowResizeDelegate !=null) m_WindowResizeDelegate -= value; } } /// /// Происходит при получении книгий фокуса /// public event AppEvents_WorkbookActivateEventHandler OnWorkbookActivateDelegate { add { lock(this) m_WorkbookActivateDelegate += value; } remove { lock(this) if (m_WorkbookActivateDelegate !=null) m_WorkbookActivateDelegate -= value; } } /// /// Происходит при установке дополнений в книгу (?) См. MSDN /// public event AppEvents_WorkbookAddinInstallEventHandler OnWorkbookAddinInstallDelegate { add { lock(this) m_WorkbookAddinInstallDelegate += value; } remove { lock(this) if (m_WorkbookAddinInstallDelegate !=null) m_WorkbookAddinInstallDelegate -= value; } } /// /// Происходит при деинсталляции дополнений в книгу (?) См. MSDN /// public event AppEvents_WorkbookAddinUninstallEventHandler OnWorkbookAddinUninstallDelegate { add { lock(this) m_WorkbookAddinUninstallDelegate += value; } remove { lock(this) if (m_WorkbookAddinUninstallDelegate !=null) m_WorkbookAddinUninstallDelegate -= value; } } /// /// Происходит перед закрытием книги /// public event AppEvents_WorkbookBeforeCloseEventHandler OnWorkbookBeforeCloseDelegate { add { lock(this) m_WorkbookBeforeCloseDelegate += value; } remove { lock(this) if (m_WorkbookBeforeCloseDelegate !=null) m_WorkbookBeforeCloseDelegate -= value; } } /// /// Происходит перед печатью /// public event AppEvents_WorkbookBeforePrintEventHandler OnWorkbookBeforePrintDelegate { add { lock(this) m_WorkbookBeforePrintDelegate += value; } remove { lock(this) if (m_WorkbookBeforePrintDelegate !=null) m_WorkbookBeforePrintDelegate -= value; } } /// /// Происходит перед сохранением книги /// public event AppEvents_WorkbookBeforeSaveEventHandler OnWorkbookBeforeSaveDelegate { add { lock(this) m_WorkbookBeforeSaveDelegate += value; } remove { lock(this) if (m_WorkbookBeforeSaveDelegate !=null) m_WorkbookBeforeSaveDelegate -= value; } } /// /// Происходит при потере книгой фокуса /// public event AppEvents_WorkbookDeactivateEventHandler OnWorkbookDeactivateDelegate { add { lock(this) m_WorkbookDeactivateDelegate += value; } remove { lock(this) if (m_WorkbookDeactivateDelegate !=null) m_WorkbookDeactivateDelegate -= value; } } /// /// Происходит при добавлении новой страницы /// public event AppEvents_WorkbookNewSheetEventHandler OnWorkbookNewSheetDelegate { add { lock(this) m_WorkbookNewSheetDelegate += value; } remove { lock(this) if (m_WorkbookNewSheetDelegate !=null) m_WorkbookNewSheetDelegate -= value; } } /// /// Происходит при открытии книги /// public event AppEvents_WorkbookOpenEventHandler OnWorkbookOpenDelegate { add { lock(this) m_WorkbookOpenDelegate += value; } remove { lock(this) if (m_WorkbookOpenDelegate !=null) m_WorkbookOpenDelegate -= value; } } /// /// См. MSDN /// public event AppEvents_WorkbookPivotTableCloseConnectionEventHandler OnWorkbookPivotTableCloseConnectionDelegate { add { lock(this) m_WorkbookPivotTableCloseConnectionDelegate += value; } remove { lock(this) if (m_WorkbookPivotTableCloseConnectionDelegate !=null) m_WorkbookPivotTableCloseConnectionDelegate -= value; } } /// /// См. MSDN /// public event AppEvents_WorkbookPivotTableOpenConnectionEventHandler OnWorkbookPivotTableOpenConnectionDelegate { add { lock(this) m_WorkbookPivotTableOpenConnectionDelegate += value; } remove { lock(this) if (m_WorkbookPivotTableOpenConnectionDelegate !=null) m_WorkbookPivotTableOpenConnectionDelegate -= value; } } #endregion #region// Создание, подключение и завершение /// /// Ссылка на интерфейс IConnectionPointContainer /// private UCOMIConnectionPointContainer icpc = null; /// /// Ссылка на интерфейс IConnectionPoint /// private UCOMIConnectionPoint icp = null; /// /// Идентификатор объекта в точке подключения /// private int cookie = 0; /// /// Ссылка на объект Excel /// object FExcel = null; private bool m_Disposed = false; /// /// Подключение к Excel /// public bool Connect() { try { // Получаем ссылку на Excel FExcel = Marshal.GetActiveObject("Excel.Application"); // Получаем ссылку на интерфейс IConnectionPointContainer icpc = FExcel as UCOMIConnectionPointContainer; // Получаем ссылку на "точку подключения" Guid guid = new Guid("00024413-0000-0000-C000-000000000046"); icpc.FindConnectionPoint(ref guid, out icp); // Регистрируем себя в точке подключения и сохраняем идентификатор cookie icp.Advise(this, out cookie); // Устанавливаем флаг - "мы подключены" и возвращаем результат - удачное подключение return (m_Disposed = false); } catch(Exception ex) { //Что-то произошло - освобождаем ресурсы Dispose(); // Заверщаем метод return false; } } /// /// Отключение от Excel /// public void Dispose() { if(!m_Disposed) { // Отписываемся от событий try { icp.Unadvise(cookie); } catch(Exception ex) { } // Прибиваем COM объект try { Marshal.ReleaseComObject(FExcel); } catch(Exception ex) { } // Очищаем память GC.GetTotalMemory(true); // Устанавливаем флаг - объект завершен m_Disposed = true; // Подавляем вызов деструктора GC.SuppressFinalize(this); } } public ExcelEventsProvider() { } ~ExcelEventsProvider() { Dispose(); } #endregion } #endregion #region// Делегаты public delegate void AppEvents_NewWorkbookEventHandler(object sender); public delegate void AppEvents_SheetActivateEventHandler(object sender); public delegate void AppEvents_SheetBeforeDoubleClickEventHandler(object sender, object Range, ref bool Cancel); public delegate void AppEvents_SheetBeforeRightClickEventHandler(object sender, object Range, ref bool Cancel); public delegate void AppEvents_SheetCalculateEventHandler(object sender); public delegate void AppEvents_SheetChangeEventHandler(object sender, object Range); public delegate void AppEvents_SheetDeactivateEventHandler(object sender); public delegate void AppEvents_SheetFollowHyperlinkEventHandler(object sender, object Hyperlink); public delegate void AppEvents_SheetPivotTableUpdateEventHandler(object sender, object PivotTable); public delegate void AppEvents_SheetSelectionChangeEventHandler(object sender, object Range); public delegate void AppEvents_WindowActivateEventHandler(object Workbook, object Window); public delegate void AppEvents_WindowDeactivateEventHandler(object Workbook, object Window); public delegate void AppEvents_WindowResizeEventHandler(object Workbook, object Window); public delegate void AppEvents_WorkbookActivateEventHandler(object Workbook); public delegate void AppEvents_WorkbookAddinInstallEventHandler(object Workbook); public delegate void AppEvents_WorkbookAddinUninstallEventHandler(object Workbook); public delegate void AppEvents_WorkbookBeforeCloseEventHandler(object Workbook, ref bool Cancel); public delegate void AppEvents_WorkbookBeforePrintEventHandler(object Workbook, ref bool Cancel); public delegate void AppEvents_WorkbookBeforeSaveEventHandler(object Workbook, bool save, ref bool Cancel); public delegate void AppEvents_WorkbookDeactivateEventHandler(object Workbook); public delegate void AppEvents_WorkbookNewSheetEventHandler(object Workbook, object sheet); public delegate void AppEvents_WorkbookOpenEventHandler(object Workbook); public delegate void AppEvents_WorkbookPivotTableCloseConnectionEventHandler(object Workbook, object PivotTable); public delegate void AppEvents_WorkbookPivotTableOpenConnectionEventHandler(object Workbook, object PivotTable); #endregion }