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
}