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
}