如何使用 Visual C# .NET 处理 Excel 事件

事件处理概述 
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 自动化服务器的绑定

时间: 2025-01-31 20:52:30

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

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

本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法.本文还提供了每种方法的优点和缺点,以便您可以选择最适合您的情况的解决方案. 概述 最常用于向 Excel 工作簿传输数据的方法是"自动化".利用"自动化"功能,您可以调用特定于 Excel 任务的方法和属性."自动化"功能为您提供了指定数据在工作簿中所处的位

visual studio C/C++ 编程学习 visual studio 中的生成事件

也许是太方便了,大家在visualstudio中调试代码时,大多习惯了直接点这个小绿箭头,但其实从点这个小绿箭头直到程序开始运行中间经历了多个步骤. 下面我就这段事件在编译过程中遇到的问题,讲一些我的经验. 今天先来说一说 visual studio 中的生成事件 一个事例:有几幅bmp图像数据文件放在 test .vcproj工程文件所在文件夹下面的Data文件夹中.此时,外界调用该工程所生成的DLL文件,且需要取Data文件夹中bmp图像数据文件. 如下图所示: 作为首启动项的CallTes

用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(二)

--将EXCEL VBA代码移植到VB.NET .NET是微软公司在2002年推出的全新编程框架,支持多种语言应用程序开发.使用Visual Basic在Microsoft .NET Framework上编程,这就是Visual Basic.NET,简称VB.NET. VB.NET是Microsoft Visual Studio .NET组件中的重要组成部分,是VB6.0的后续版本,VB.NET仍使用VB的基本语法,二者几乎在90%以上保持相似或相同,虽然Excel VBA代码不能完全像移植到V

Visual Basic 2017 操作Excel和word【1】

 清单1.1  从应用程序对象导航到Excel中的工作表  Dim myWorkbooks As Excel.Workbooks = app.Workbooks Dim myWorkbook As Excel.Workbook = myWorkbooks.Item(1) Dim myWorksheets As Excel.Sheets = myWorkbook.Worksheets Dim myWorksheet As Excel.Worksheet myWorksheet = CType(my

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

清单2.1   通过控制台应用程序自动化Excel Imports Excel = Microsoft.Office.Interop.Excel Module Module1 Private exitXL As Boolean = False Dim WithEvents myExcelApp As Excel.Application Sub Main() myExcelApp = New Excel.Application myExcelApp.Visible = True myExcelAp

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

在.NET开发中,不管是web程序还是桌面软件(尤其是涉及数据库操作的MIS系统等),常常需操作Excel,如导出数据到Excel,读取Excel中数据到程序中等.总结起来,其操作不外乎创建.打开.读写.保存(后退出/释放),而其操作方法,则主要有:通过ADO.NET数据连接方式.通过Excel对象模型"自动化"操作.使用中间数据格式如文本文件,XML等间接操作Excel.使用第三方控件(主要用于向Excel传输数据)等.在开始讨论之前,先把相关的一些网上资源罗列一下,其中大部分来自M

Visual Event :快速查看 DOM 上绑定的 JS 事件

http://web.jobbole.com/82503/ Javascript中的事件经常被认为如谜一般不可解.Javascript是一个事件驱动的语言,在这样的前提下前面的看法是很奇怪,但是说到它们的复杂本质和调试难度时,这样的看法又是很正常的.为此,我创建了可视化事件(Visual Event)来查看DOM节点上绑定的事件. 简介 Visual Event是一个开源 Javascript 书签,能提供绑定在DOM元素上的事件调试信息.Visual Event能显示如下信息: 1.哪一个元素

Chrome插件Visual Event查看Dom元素绑定事件的利器

找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开源 Javascript 书签,能提供绑定在DOM元素上的事件调试信息.Visual Event能显示如下信息: 1.哪一个元素有事件绑定 2.某元素上绑定的事件类型 3.事件触发后运行的代码段 4.定义绑定函数的源文件和行号(仅限于WebKit和Opera浏览器) 除了对调试你自己的代码大有用途,

VSTO:使用C#开发Excel、Word【7】

                        第2章Office解决方案介绍 Office解决方案的三种基本模式现在,您了解Office对象模型的基本模式,本章将介绍开发人员如何模拟和构建其Office解决方案. 使用Office构建的大多数解决方案都遵循三种模式之一 Office 自动化执行 Office 加载项 Office 文档背后的代码 一个自动化可执行文件是一个独立于Office控制和自动化Office应用程序的程序.可以使用Visual Studio等开发工具创建自动化可执行文件.