当前位置:编程学习 > C#/ASP.NET >>

使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程(二)

答案:

示例 3:打开现有的 Word 文档


Documents.SaveAs 方法一样,Documents.Open 方法签名在 Office 2000 和 OfficeXP 之间也存在差别,因此新名称包装在 #if 声明中。Open 方法和 SaveAs 方法一样简单,如下所示:
    object fileName = Environment.CurrentDirectory+"\\example3";    object optional=Missing.Value;#if OFFICEXP    _Document doc = app.Documents.Open2000( ref fileName,#else    _Document doc = app.Documents.Open( ref fileName,#endif                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional,                         ref optional);

帮助中的 Word 2002 Visual Basic 参考以及 MSDN(英文)中有关 Documents.Open 方法的说明记录了这些可选参数。
本示例中比较让人感兴趣的代码是,打开的文档中的文本先被突出显示,然后被剪切:
    object first=0;    object last=doc.Characters.Count;    Range r = doc.Range(ref first, ref last);    r.Select();    Thread.Sleep (2000);    r.Cut();

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

如何生成和运行 example3.cs


要生成 example3.cs,可以在 Visual Studio .NET Command Prompt(Visual Studio .NET 命令提示)窗口中执行以下操作:
  1. 打开保存 example3.cs 源文件的目录(例如 C:\CSOfficeSamples),并在命令提示后键入 csc /r:"C:\Office XP PIAs\Microsoft.Office.Interop.Word.dll" /d:OFFICEXP example3.cs
    (如果 Office XP PIA 保存在其他位置,则需要使用相应值替换下面的“驱动器”和“安装路径”:csc /r:驱动器:\<安装路径>\Microsoft.Office.Interop.Word.dll /d:OFFICEXP example3.cs。)
  2. 要运行 example3.exe(与 example3.cs 源文件位于同一文件夹中),双击该程序即可。

示例 4:使用 Word 公开的事件


本示例涉及的内容要比其他几个多一些,但实际上并不复杂。看起来复杂的主要原因在于标识事件及其处理程序类型的名称长一些。看一看 Office XP 版本的 DocumentOpenDocumentChange 事件处理程序的设置代码:
...#if OFFICEXP    ApplicationEvents3_DocumentOpenEventHandler myOpenDoc = new        ApplicationEvents3_DocumentOpenEventHandler            (MyOpenEventHandler);    ApplicationEvents3_DocumentChangeEventHandler myChangeDoc = new        ApplicationEvents3_DocumentChangeEventHandler(DocChange);#else...

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

现在就可以使用这两个事件了。调用 Open 方法时,这两个事件将同时引发。依次打开超链接阅读有关 DocumentOpen(英文)和 DocumentChange(英文)方法的文档。
那么,如何知道哪些事件可用及其处理程序的调用方法呢?如果使用 ILDASM 检查 Word 2002 PIA (Microsoft.Office.Interop.Word.dll),会发现在有些类型前面标有绿色倒三角标志。该标志表示成员是一个事件。图 4 显示了 ILDASM 树视图图标的帮助。

图 4:ILDASM 的树视图图标帮助

图 5:使用 ILDASM 查看 Application 对象的事件(单击图片查看大图像)
图 5 显示了 Application 对象的事件的部分屏幕快照。每一行最左边的标识符是事件名称。冒号右边是事件处理程序的完整限定类型名。例如,DocumentBeforeSave 事件要求有如下类型的处理程序:
Microsoft.Office.Interop.Word  .ApplicationEvents3_DocumentBeforeSaveEventHandler

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

图 6:在 ILDASM 中查看事件处理程序声明
让我们感兴趣的是 Invoke 方法。为事件处理程序编写的函数必须具有此签名。但是如何知道参数的含义及其使用的值呢?这就是 Word 2002 Visual Basic 文档的重要性所在。对于 DocumentBeforeSave 事件,文档(英文)叙述如下:
Private Sub object_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As  Boolean, Cancel As Boolean)

该文档接下来描述了每个参数的含义。请记住,C# 在默认情况下按值传递参数,而 Visual Basic 在默认情况下按引用传递参数。这就是为什么两个 Boolean 参数在用 ILDASM 显示时后面要跟 & 符号,而在 C# 中使用时则用关键字 ref 标记的原因了。同样,Visual Basic 中的 Subs 在 C# 中被看作返回 void 的方法。因此,DocumentSave 事件的处理程序应类似于如下所示:
public static void SaveHandler (Document doc, ref bool b1, ref bool b2) {    MessageBox.Show ("Saving document", "DocumentSave event",     MessageBoxButtons.OK, MessageBoxIcon.Information);}

当通过调用 SaveAs 方法保存文档时,DocumentBeforeSave 事件将在保存文档前引发。
SaveAs 方法调用的后面几行代码中,您将看到如下代码片段:
app.DocumentChange -= myChangeDo

上一个:从 VBA 中使用 Visual Basic .NET 将 Word 文档序列化为 XML
下一个:酷哦,Office XP Primary Interop Assemblies For .Net

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,