事件处理概述 
Visual C# .NET 使用委派处理来自组件对象模型 (COM) 服务器的事件。委派是 Microsoft Visual Studio .NET 中的一个新概念。对于 COM 事件,委派是一种特殊对象,它侦听来自 COM 服务器的事件,然后将其转发给 Visual C# 函数。要使用委派,必须创建对象的实例,然后将该对象实例添加到要侦听的事件中。每个事件都有一个委派,该委派专门设计用于将 COM 事件(使用本机数据类型)转换为标准 Microsoft .NET 调用(使用托管数据类型)。
创建 Visual C# .NET 自动化客户端 
要使用委派从使用 Visual C# .NET 开发的自动化客户端处理 Excel 事件,请按照下列步骤操作:1. 启动 Visual Studio .NET 2002 或 Visual Studio .NET 2003。在“文件”菜单上,单击“新建”,然后单击“项目”。在“Visual C# 项目”下,选择“Windows 应用程序”。将项目命名为 XLEventTest,然后单击“确定”。
默认情况下会创建 Form1。  
2. 添加对“Microsoft Excel 对象库”的引用。为此,请按照下列步骤操作: a.  在“项目”菜单上,单击“添加引用”。  
b.  在“COM”选项卡上,找到“Microsoft Excel 11.0 对象库”,然后单击“选择”。 
c.  在“添加引用”对话框中单击“确定”,接受您的选择。如果系统提示您为选定的库生成包装,请单击“是”。  
 
3. 在解决方案资源管理器中,双击“Form1.cs”以在“设计”视图中显示该窗体。  
4. 在“视图”菜单上,单击“工具箱”以显示工具箱,然后向 Form1 中添加一个按钮。将该按钮的“Text”属性更改为启动 Excel。  
5. 双击“启动 Excel”以显示该窗体的“代码”窗口。将以下代码添加到该按钮的 Click 事件处理程序中:  private void button1_Click(object sender, System.EventArgs e)
{
   StartExcelAndSinkEvents();

 
6. 在靠近文件顶部、另一个 using 语句下方添加以下代码: using System.Reflection;
using System.Diagnostics;
using Excel = Microsoft.Office.Interop.Excel; 
 
7. 将以下代码添加到 Form1 类中,使其位于步骤 5 中的 Click 事件处理程序的下方:  //Excel Automation variables:
Excel.Application xlApp;
Excel.Workbook xlBook;
Excel.Worksheet xlSheet1, xlSheet2, xlSheet3;
//Excel event delegate variables:
Excel.AppEvents_WorkbookBeforeCloseEventHandler EventDel_BeforeBookClose;
Excel.DocEvents_ChangeEventHandler EventDel_CellsChange;
private void StartExcelAndSinkEvents()
{
   //Start Excel, and then create a new workbook.
   xlApp = new Excel.Application();
   xlBook = xlApp.Workbooks.Add( Missing.Value );
   xlBook.Windows.get_Item(1).Caption = "XL Event Test";
   xlSheet1 = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);
   xlSheet2 = (Excel.Worksheet)xlBook.Worksheets.get_Item(2);
   xlSheet3 = (Excel.Worksheet)xlBook.Worksheets.get_Item(3);
   xlSheet1.Activate();
   //Add an event handler for the WorkbookBeforeClose Event of the
   //Application object.
   EventDel_BeforeBookClose =
      new Excel.AppEvents_WorkbookBeforeCloseEventHandler( BeforeBookClose);
   xlApp.WorkbookBeforeClose += EventDel_BeforeBookClose;
   //Add an event handler for the Change event of both worksheet objects.
   EventDel_CellsChange = new Excel.DocEvents_ChangeEventHandler( CellsChange);
   xlSheet1.Change += EventDel_CellsChange;
   xlSheet2.Change += EventDel_CellsChange;
   xlSheet3.Change += EventDel_CellsChange;
   //Make Excel visible and give the user control.
   xlApp.Visible = true;
   xlApp.UserControl = true;
}
private void CellsChange(Excel.Range Target )
{
   //This is called when any cell on a worksheet is changed.
   Debug.WriteLine("Delegate: You Changed Cells " +
      Target.get_Address( Missing.Value, Missing.Value,
      Excel.XlReferenceStyle.xlA1, Missing.Value, Missing.Value ) +
      " on " + Target.Worksheet.Name);
}
private void BeforeBookClose(Excel.Workbook Wb, ref bool Cancel )
{
   //This is called when you choose to close the workbook in Excel.
   //The event handlers are removed, and then the workbook is closed
   //without saving the changes.
   Wb.Saved = true;
   Debug.WriteLine("Delegate: Closing the workbook and removing event handlers.");
   xlSheet1.Change -= EventDel_CellsChange;
   xlSheet2.Change -= EventDel_CellsChange;
   xlSheet3.Change -= EventDel_CellsChange;
   xlApp.WorkbookBeforeClose -= EventDel_BeforeBookClose;
}      
 
 
测试代码 
1. 按 Ctrl+Alt+O 以显示“输出”窗口。 
2. 按 F5 生成并运行该程序。 
3. 在窗体上,单击“启动 Excel”按钮。
程序将启动 Excel,然后创建一个具有三张工作表的工作簿。 
4. 向任一张工作表的单元格中添加任意数据。
查看 Visual Studio 中的“输出”窗口,以确认调用了事件处理程序。 
5. 退出 Excel,然后关闭窗体以结束调试会话。
 回到顶端
疑难解答 
编译代码时,可能会收到以下编译器错误消息:
命名空间已经包含了“Excel”的定义
如果没有安装用于 Excel 的主互操作程序集 (PIA),则会收到此错误消息。要解决此问题,请按照下列步骤操作:1. 运行 Microsoft Office 安装程序,然后安装 Excel PIA。在 Office 安装程序中,PIA 显示为 Excel 下的一个组件“.NET 可编程性支持”。 
2. 打开您的项目,删除对 Excel 互操作程序集的引用,然后重复本文“创建 Visual C# .NET 自动化客户端”部分中的步骤 2,以正确地引用 PIA。 
测试该代码时,您可能会收到以下错误消息:
未处理的“System.InvalidCastException”类型的异常出现在 interop.excel.dll 中。
其他信息:不支持此种接口
有关此错误消息的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 
316653 (http://support.microsoft.com/kb/316653/) PRB:使用 WithEvents 或委派从 Visual Basic .NET 或 Visual C# .NET 处理 Excel 事件时出现错误 
 回到顶端
参考
有关其他信息,请访问下面的 Microsoft Developer Network (MSDN) 网站: 
http://msdn.microsoft.com/library/en-us/dnoxpta/html/vsofficedev.asp(http://msdn.microsoft.com/library/en-us/dnoxpta/html/vsofficedev.asp)
有关在 Visual C# .NET 中实现 Excel 自动化的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 
302084 (http://support.microsoft.com/kb/302084/) 如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化 
302096 (http://support.microsoft.com/kb/302096/) 如何在 Visual C# .NET 中使 Excel 自动运行以使用数组填充或获取某个区域中的数据 
302902 (http://support.microsoft.com/kb/302902/) 用 Visual C# 进行 Office 自动化服务器的绑定 

如何使用 Visual C# .NET 处理 Excel 事件的更多相关文章

  1. 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据

    本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法.本文还提 ...

  2. Visual Basic 2017 操作Excel和word【1】持续更新……

    我坚持在VB的路上走到黑…………  清单1.1  从应用程序对象导航到Excel中的工作表  Dim myWorkbooks As Excel.Workbooks = app.Workbooks ) ...

  3. Visual Basic 2017 操作Excel和word【2】持续更新……

    1.控制台程序创建Excel,并设置状态栏显示“Hello World”文本 Module Module1 Private exitXL As Boolean = False Dim WithEven ...

  4. Visual Studio项目的生成事件代码

    我们打开vs的项目属性可以看到有生成事件,如下图: 可以看到有两块空白区域,这个空白区域可以让我们写代码或脚本来处理编译生成前后的时候,处理一些事情,今天就简单的来说说这两块. 生成前事件命令行 我想 ...

  5. Visual Studio2013应用笔记---WinForm事件中的Object sender和EventArgs e参数

    Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...

  6. Visual Studio中“后期生成事件命令行” 中使用XCopy命令

    将程序所依赖的动态库与其他依赖文件做了分类,使用XCopy命令自动生成相应的目录结构. set source="$(TargetDir)" set output="$(S ...

  7. C#操作Excel(创建、打开、读写、保存)几种方法的总结

    在.NET开发中,不管是web程序还是桌面软件(尤其是涉及数据库操作的MIS系统等),常常需操作Excel,如导出数据到Excel,读取Excel中数据到程序中等.总结起来,其操作不外乎创建.打开.读 ...

  8. Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010

    摘  要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...

  9. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

随机推荐

  1. CSS学习笔记-05 过渡模块的基本用法

    话说 1对情侣两情相悦,你情我愿.时机成熟,夜深人静...咳 ,如果就这么直奔主题,是不是有点猴急,所以,还是要来点前戏@. 铛 铛, 这个时候 过渡模块出现了. 划重点: 上代码: <!DOC ...

  2. L332 NBA: Dwyane Wade and Dirk Nowitzki Say Emotional Goodbyes

    Two games in the NBA ended amid emotional scenes on Tuesday as legends at separate teams marked thei ...

  3. Windows平台下不同版本SVN对比

    (1)SVN服务端subversion与SVN客户端tortoiseSVN (2)subversion服务器程序在windows下共有5个下载版本,分别是:Collabnet , SlikSVN , ...

  4. Linux:ldd命令详解

    ldd 用于打印程序或者库文件所依赖的共享库列表. 语法 ldd(选项)(参数) 选项 --version:打印指令版本号: -v:详细信息模式,打印所有相关信息: -u:打印未使用的直接依赖: -d ...

  5. 蓝牙协议分析(11)_BLE安全机制之SM

    1. 前言 注1:此SM是Security Manager的缩写,非彼SM,大家不要理解歪了! 书接上文,我们在“蓝牙协议分析(10)_BLE安全机制之LE Encryption”中介绍了BLE安全机 ...

  6. cython 成功创建import 模块

    又是因为别人代码里有这么一个部分,用到了cython,,简而言之,就是利用这个模块调用C语言,从而加速程序运行,其中具体怎么调用我还没整清楚,但基本用法差不多了解了. 1 安装:https://www ...

  7. UVA-315 无向图求割点个数

    题意抽象: 给定一个无向图,输出割点个数. 割点定义:删除该点后,原图变为多个连通块. 考虑一下怎么利用tarjan判定割点: 对于点u和他相连的当时还未搜到的点v,dfs后如果DFN[u]<= ...

  8. 2017《JAVA技术》预备作业2-计科1502-19-何俏依

    Git学习笔记 1.安装git并验证安装成功 2.注册码云账号并配置git 3.创建ssh key并在码云上添加公钥,验证公钥添加成功 添加公钥的过程中,出现了一些问题,未找到文件,经过老师的指点,仔 ...

  9. vue安装过程

    我们3个安装参考的博客地址 http://blog.qianduanchina.cn/post/596c5bb27838a71273eb4da3 http://blog.csdn.net/unamat ...

  10. python:Hamlet英文词频统计

    #CalHamletV1.py def getText(): #定义函数读取文件 txt = open("hamlet.txt","r").read() txt ...