设为首页 - 加入收藏
广告 1000x90
您的当前位置:78345黄大仙救世网24码 > 接口程序集 > 正文

使用C进行Word 2002和Excel 2002编程

来源:未知 编辑:admin 时间:2019-05-17

  :了解MicrosoftC# 和大型复杂的 COM服务器之间的 COM 互操作性。本文介绍了如何准备 Office XP COM 对象以及如何在 C# 程序中使用这些对象,同时还提供了一些提示,帮助您理解为何某些操作必须通过特定方法才能实现。

  本文假定您要进行 Office XP 编程。尽管本文通篇提供了 MSDN® 文档的超链接,但要掌握本文介绍的内容,您应该已经熟悉或者能够访问 Office XP 编程文档。

  该文档介绍了 Office XP 提供的接口和公共类及其使用方法。文档内容以 Visual Basic 编程语言形式表达,因此您需要在头脑中对其中的方法和事件签名进行转换。本文将介绍如何进行这种转换,如何准备 Office XP 的 COM 对象,以及如何在 C# 程序中使用这些 COM 对象。最后,本文还提供了一些提示,帮助您理解为何某些操作必须通过特定方法才能实现。通过此信息,您就应能够利用其他使用 C# 的 COM 服务器。

  .NET 技术引入了程序集的概念,并将其作为基本的可执行单元。程序集可以是可执行文件(.exe) 或动态链接库 (.dll),并可以包含多个文件。程序集包含有关运行程序所需的代码、类型和资源的全部信息。

  要使用 Office XP 公开的 COM 对象,需要使用主互操作程序集 (PIA),这样 C# 编译器就能够找到 Office XP 公开的接口和公共类。

  了解一下已公开的类型信息通常会给您一些启示。Microsoft Visual Studio® .NET 提供了一个称作 ILDASM 的工具,用于列出封装在程序集中的类型信息。图 1 是 ILDASM 显示 Word 2002 主互操作性程序集信息的部分屏幕快照。

  要打开 ILDASM 工具,请单击“开始”,指向“程序”,指向“Microsoft Visual Studio .NET”,然后指向

  。ILDASM 窗口随后打开。要查看某一特定互操作程序集或 PIA 的类型信息,在

  (打开)。浏览到互操作程序集或 PIA 的所在位置,选择要查看的互操作程序集或 PIA 并单击

  本文出于演示目的,将 Office XP PIA 解压缩到以下文件夹:C:\Office XP PIAs\。然后将其安装到全局程序集缓存 (GAC) 并进行注册。

  可通过在命令行键入 C# 编译器的可执行文件名称 (csc.exe) 来调用此编译器。安装并注册 PIA 后,便可使用 /r 选项,象引用其他任何程序集一样在csc命令行上对其进行引用。如果 PIA 的位置无法访问,程序将在运行时失败,并生成一个System.IO.FileNotFoundException或System.TypeInitializationException类型的异常,告知哪个程序集无法加载。

  接下来在“如何编译和运行 example1.cs”一节中,将会介绍如何使用命令行生成 C# 程序和引用 PIA。

  演示代码示例之前,首先应下载 odc_offcs.exe 文件并将示例程序解压缩到 C:\CSOfficeSamples 或您选择的目录中。为便于引用,在下面的所有示例中,都假定示例程序位于 C:\CSOfficeSamples 目录中。

  第一个示例非常简单,只显示如何启动 Word 2002,并使其在几秒内保持打开状态,然后再将其关闭。首先看一看 example1.cs 源文件中的主要代码行。下面的代码片段分配Application对象和它的基类对象,但实际上是进行CoCreateInstance调用。

  Application类的Quit方法接受三个参数:saveChanges、originalFormat和routeDocument。这些可选参数可在Visual Basic代码中省略,而 C# 中则没有可选参数;所有这三个参数都必须在调用时传递给Quit。在 C# 中可通过将值Missing.Value赋给每个可选变量(用于通知Quit方法使用默认行为)可获得同样效果。在本示例中,即表示“不保存文档,保留文档的初始格式,并且不进行路由选择”。

  请注意,所有这三个参数都标有 ref 关键字。由于这些方法最初是用 Visual Basic 编写的,而默认情况下 Visual Basic 按引用来传递参数。因此,此处也必须按引用来传递参数。

  该示例是一个非常简单的程序,并不具备任何让人感兴趣的功能,现在让我们看一看示例 2。

  example2.cs 与示例 1 一样,也是使用Application对象启动 Word 2002,然后在打开文档的集合(该集合封装在Application.Documents属性中)中添加一个新文档。第一个有意义的代码片断在创建新文档时出现的:

  Add方法的所有参数都是可选的,因此必须给这些参数指定一个有意义的值或是指定 Missing.Value。在该示例中,由于我们不需要使用或创建模板,并且这只是一个纯文本文档,因此将前三个参数(template、newTemplate和documentType)设置为Missing.Value。由于希望此文档在本示例中可见,因此将参数 visible 设置为“true”。

  您可能会对如何确定是否应将Boolean值赋给visible对象感到不解。这就是为什么访问 Word 2002 编程文档很重要的原因所在了。如果看一看 Word 2002 对象模型文档中有关Documents.Add方法的说明,您会看到以下内容:

  使用从app.Documents.Add()函数调用返回的文档接口,在文档开始处添加了一些文本。此处没有特别之处。

  首先要注意的一件事就是,保存文件名称的字符串被封装到 fileName 对象中。其次,此代码将在定义了 OFFICEXP 的情况下调用SaveAs2000方法,而在未定义 OFFICEXP 的情况下调用SaveAs方法。或许您已经猜到,SaveAs方法签名在 Office 2000 和 Office XP 之间存在差别。

  本示例中比较让人感兴趣的代码是,打开的文档中的文本先被突出显示,然后被剪切:

  第一个字符和最后一个字符位置的整数值被封装到第一个和最后一个对象,然后传递给 Document.Range() 函数,该函数返回 Select() 函数调用的Range对象。这种显式封装是必需的,因为Range对象期待引用其参数,并且任何隐式或显式的转换都会将参数改为右值,而右值是不能按引用传递的。本示例使文本突出显示持续两秒钟,而后对文本进行剪切。剪切操作也可以通过以下代码实现:

  本示例涉及的内容要比其他几个多一些,但实际上并不复杂。看起来复杂的主要原因在于标识事件及其处理程序类型的名称长一些。看一看 Office XP 版本的DocumentOpen和DocumentChange事件处理程序的设置代码:

  这两条语句仅仅是声明事件的事件处理程序。随后的几行代码中,这些处理程序将指定给Application对象app中的事件:

  现在就可以使用这两个事件了。调用Open方法时,这两个事件将同时引发。依次打开超链接阅读有关 DocumentOpen(英文)和 DocumentChange(英文)方法的文档。

  那么,如何知道哪些事件可用及其处理程序的调用方法呢?如果使用 ILDASM 检查 Word 2002 PIA (Microsoft.Office.Interop.Word.dll),会发现在有些类型前面标有绿色倒三角标志。该标志表示成员是一个事件。图 4 显示了 ILDASM 树视图图标的帮助。

  图 5 显示了 Application 对象的事件的部分屏幕快照。每一行最左边的标识符是事件名称。冒号右边是事件处理程序的完整限定类型名。例如,DocumentBeforeSave 事件要求有如下类型的处理程序:

  请注意,事件并未告诉我们任何有关事件处理程序签名的信息。因此,需要看一下事件处理程序声明。在 ILDASM 中,如果双击ApplicationEvents3_DocumentBeforeSaveEventHandler类型,就会看到类似图 6显示的内容。

  让我们感兴趣的是Invoke方法。为事件处理程序编写的函数必须具有此签名。但是如何知道参数的含义及其使用的值呢?这就是 Word 2002 Visual Basic 文档的重要性所在。对于DocumentBeforeSave事件,文档(英文)叙述如下:

  该文档接下来描述了每个参数的含义。请记住,C# 在默认情况下按值传递参数,而 Visual Basic 在默认情况下按引用传递参数。这就是为什么两个Boolean参数在用 ILDASM 显示时后面要跟 & 符号,而在 C# 中使用时则用关键字ref标记的原因了。同样,Visual Basic 中的Subs在 C# 中被看作返回 void 的方法。因此,DocumentSave事件的处理程序应类似于如下所示:

  当通过调用SaveAs方法保存文档时,DocumentBeforeSave事件将在保存文档前引发。

  此代码行解除了DocumentChange事件的挂钩,这样该事件就不会在调用Quit期间引发了。

  example5.cs 源文件中的每个重要步骤都作了详细注释。由于易于理解,此处不准备对此代码加以介绍。

  Word 2002 很少用到默认属性和索引属性,而 Excel 2002 却经常用到它们,因此本示例 (excel1.cs) 利用了这一事实。

  同所有 Office XP 互操作代码一样,本示例程序从实例化 Application 对象开始。创建工作簿和工作表后,创建了一个用于保存列标题的字符串数组。创建完该数组后,您将看到如下代码片段:

  此代码获取单元格 A2 到 D2 的 Range 对象。但既然工作表有一个 Range 属性,为什么还需要直接调用访问函数呢?并且这样做为何不象通常那样会产生语法错误?

  与 Visual Basic 和Visual C++不同,C# 没有适用于索引属性的语法结构。要在 C# 中使用索引属性,就必须直接调用访问函数。_Worksheet.Range属性便是一个很好的例子。要在 Visual C++ 中获取Range属性的值,代码应如下所示:

  _Workbook.Worksheets具有所谓的默认属性。默认属性在互操作程序集中被看作是名称为 Item 的属性。通常必须指定 Item 成员才能从 C# 使用默认属性,但是在 Excel 库中,TLBIMP 只需少量代码就可以创建称为get__Default或set__Default的访问函数。如果这两个访问函数存在,C# 就可以使用索引生成器语法而不是直接调用访问函数。本示例中的这两行代码如下所示:

  C# 的 COM 互操作是一种非常有用的工具,因为利用它可以直接使用现有对象而无需为那些对象重写代码。本文可帮助您利用现有 COM 对象代码。

本文链接:http://acrylinkg.com/jiekouchengxuji/14.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top