使用 Word 2007 和 Visual Basic 2005 自动创建数据丰富的业务文档

来源:互联网 发布:sqlserver分布式查询 编辑:程序博客网 时间:2024/05/10 06:56
简介

Visual Basic 一直是用于 Microsoft Word 自动化的首选语言。Word 自动化是用于“远程控制”Word 的一项技术,可以使其启动、加载文档、添加内容、打印、保存和退出。由于 Word 是用于创建丰富文档的绝佳工具,因此自动化便自然成为一项机械化技术,用于制作结合结构化数据和非结构化内容、而且美观的报告、发票、信函以及其他文档。

尽管如此,让 Word 自动创建数据丰富的业务文档长期以来都是一门“黑魔法”,即一项反复尝试的繁琐过程,充满了崩溃和重新启动。令人欣慰的是,Visual Basic 2005 和 Word 2007 中的增强功能使得使用后端系统数据填充发票和更新报告的整个过程容易得多,并且也更加有趣。

Word 2007 可支持 Visual Basic for Applications (VBA)、Visual Studio Tools for Office (VSTO) 和自动化,因此要比以往任何时候都更具可编程性。Word 应用程序本身也更可靠,且更易于编程。Visual Basic 2005 是对 Word 2007 的自然补充,提供了与基于 COM 的 Office 应用程序之间的互操作的卓越支持、功能强大的调试功能和出色的编辑环境。Word 的可靠性和 Visual Basic 2005 的强大编程功能相结合,形成了卓越的 RAD 体验,并使 Visual Basic 程序员可以创建将推动下一波提高信息工作者生产力的增强型应用程序。

了解 Word 自动化如何工作

Microsoft Word 2007 是 COM 应用程序,可使用随 Word 一起安装的 COM 对象库来执行自动化。如果您具有编写 VBA Word 宏的经验,那么自动化中用到的许多对象对您来说应该不会陌生,因为 VBA 使用的是同一个对象库。由于 Visual Basic 2005 提供对 COM Interop 的强大支持,因此自动化 Word 的过程相当简单。为了进一步简化编程,Visual Basic 2005 为 Word 2007 库中大多数对象加入了 F1 帮助。唯一的局限性是,该帮助库落后一个版本,针对的是 Word 2003。编写本文的示例代码时,我们发现参考最新的在线文档是非常有用的,这些文档可在 MSDN 上找到:http://msdn2.microsoft.com/en-us/library/bb244515.aspx。

自动化 Word

  1. 创建 Word Application 对象。
  2. 创建一个新文档(或打开现有文档)。
  3. 更新内容。
  4. 打印、保存或邮件合并该文档。

Word 对象模型具有近 300 个对象,但实际上您需要熟知的只有四个对象:

  • Application 对象
  • Document 对象
  • Paragraph 对象
  • Selection 对象

Application 对象

Application 对象表示 Word 2007 应用程序本身。创建 Application 对象是自动化中的第一个步骤。创建 Application 对象时,会启动新的 Word 实例,允许您以编程方式操作文档。虽然 Word 在自动化过程中可以保持隐藏状态,但多数程序员还是选择让 Word 可见,以便用户可以看到文档动态更新。只需创建 Application 对象的一个实例;您可以使用此单个实例来操作多个文档。

Document 对象

创建 Application 对象后,下一步便是创建或加载一个或多个 Document 对象。Document 对象表示 Word 中的一个文档,您能够以编程方式添加内容,就像平常使用 Word 一样。

Paragraph 对象

每个文档都包含一段或多段内容。在自动化编程模型中,Paragraph 对象用来表示这其中的每一段。一个段落可包含文本、字段、表格或图片。在文档各段落中导航有助于将您的内容置于正确的位置。

Selection 对象

Selection 对象表示 Word 中当前选定内容的区域。如果没有选择内容,则它表示插入点所在的位置。Selection 对象用于在插入点添加内容——覆盖当前选定内容或插入新内容。虽然与 Paragraph 对象相似,但许多程序员认为向文档添加内容时 Selection 对象更易于使用,并且与 Paragraph 对象相比有两个重要区别:

  • Selection 对象是 Application 对象(而非 Document 对象)的成员。这反映出在任一时间点,应用程序都具有带单一插入点的单一“活动”文档。
  • Selection 对象无法被创建。实际上,Application 对象通常包含无需显式创建便可使用的单个 Selection 对象。
注意   有关 Word 对象模型这些和其他成员的详细信息,请参见 MSDN 文章“Word 对象模型概述”。

连同了解 Word 对象模型,它还涉及了解通过 Visual Basic 2005 使用 Word 的最佳实践。由于 Word 是单独的应用程序(与您的 Visual Basic 2005 应用程序“松散耦合”),因此可能会发生很多意想不到的事件。同样,在您的代码自动执行时,用户可能会选择关闭 Word 应用程序。意外问题可能会导致 Word 显示一个对话框,中止自动化代码运行,直到该对话框关闭为止。用户可能会不经意间在文档周围单击,使插入点移动。他们也可能会随意在文档中输入内容。要正确处理这些情况,最好在自动化代码中添加验证和错误检查,以便确保应用程序的可靠性。示例应用程序演示了此方法。

示例中包含哪些内容?

首先让我们看一下本文附带的示例应用程序。

示例应用程序——“WordAutomation”——显示了如何启动 Word、创建文档、插入文本和表格、用您自己的文本替换字段、执行邮件合并,以及从 ADO.NET DataTable 创建 Word 2007 表格。

首先我们需要确保您的机器已经安装了所有必备的软件:

  • Visual Studio 2005
  • Microsoft Word 2007

安装这些必备软件之后,将示例文件解压缩到您本地硬盘驱动器上的一个目录。为确保数据库连接一直有效,我们建议将示例安装到名为 c:/WordAutomation 的目录中(示例解决方案文件应为 c:/WordAutomation/VB2005/WordAutomation.sln)。

如果您选择将文件置于不同的文件夹,则需要更新 App.Config 文件中的 WordAuto.My.MySettings.ConnectionString 设置,从而指向 Microsoft Access database CustomersDB.mdb 的新数据库路径。

现在即可看一下该示例

  1. 打开解决方案 WordAutomation.sln
  2. F5 编译并运行该应用程序。
    注意   当 WordAutomation 应用程序运行时,它会打开一个具有自动化 Word 按钮的窗口。此窗口设置为停留在其他窗口的顶端,这样便于在后台更新 Word 文档时可以轻松访问自动化按钮。

    图 1. WordAutomation 应用程序窗口,具有自动化 Word 的按钮。

  3. 单击“New Document”(新建文档)按钮,WordAutomation 应用程序会创建一个新的 Word 应用程序和文档。
  4. 单击“Insert Text”(插入文本)和“Insert Table”(插入表格)添加文本和表格——应用程序会自动将样式应用到您插入的表格。

    图 2. 将文本和表格插入 Word 文档。

  5. 单击“Close”(关闭)按钮关闭文档,为整个过程中的下一步做好准备。
  6. 单击“Replace Field”(替换字段)按钮打开 FormSample.docx 文档并替换内容控件中的文本。
  7. 单击“Insert As Table”(插入为表格)将 DataGrid 中的信息复制到文档结尾的新表格。
    注意   该示例应用程序包括可重用的库,这样您可以将 ADO.NET DataTable 轻松复制到您自己应用程序中某个 Word 文档中的表格。

    图 3. 将 DataGrid 中的信息复制到 Word 文档结尾的新表格。

  8. 单击“Mail Merge”(邮件合并)按钮完全启动邮件合并到新文档。
    注意   此功能会完全自动化整个邮件合并过程,打开模板文档,配置邮件合并 DataSource 并执行合并。

    图 4. “Mail Merge”(邮件合并)按钮会启动邮件合并到新文档。

基本自动化技术

以下代码段阐明了示例应用程序中所使用的技术。

设置

您可以在任一 Visual Basic 客户端应用程序中试用下列技术。开始之前,您需要先执行一些操作来设置用于 Word 自动化的项目。

  1. 添加对 COM 对象 Microsoft Word 12.0 对象库的项目引用。
  2. 通过在包含 Word 自动化代码的任一模块、窗体或类的顶部添加语句 Imports Microsoft.Office.Interop,导入 Microsoft.Office.Interop 命名空间。
  3. 如果您打算以多种方法使用 Application 或 Document 对象,则应考虑将应用程序和文档变量定义为父窗体或类的成员变量,以使它们不会超出范围,并且您的应用程序也不会断开与 Word 的连接。

启动和退出 Word

要启动 Word,请使用以下代码,它会创建 Word.Application 对象并让 Word 可见:

Private axWord As Word.ApplicationaxWord = New Word.ApplicationaxWord.Visible = True

要退出 Word,请使用以下代码:

axWord.Quit

创建和打开文档

要创建新文档,请先启动 Word,然后使用 Application.Documents.Add 方法创建文档:

Dim axDoc As Word.DocumentaxDoc = axWord.Documents.Add

要打开文档,请使用 Application.Documents.Open 方法:

Dim axDoc As Word.DocumentaxDoc = axWord.Documents.Open("c:/MyDocument.docx")

要保存文档,请使用 Document.SaveAs 方法:

axDoc.SaveAs("C:/MyDocument.docx")

读取和插入文本

自动化 Word 时,您通常可以使用多种方法来做同一件事。读取和插入文本便是一个很好的示例。您可以使用多个不同的对象来读取和插入文本,而其中最常用的对象是 Paragraph 和 Selection 对象。我们首先看一下 Paragraph 对象。

Word 文档由一组段落组成。各段落从 1 开始进行连续编号,包括到下一个回车前的所有文本和内容。以下介绍如何将文档第一段内容转换为一个字符串:

Dim strText As StringstrText = axDoc.Paragraphs(1).Range.Text

以下介绍如何设置第一段的内容:

axDoc.Paragraphs(1).Range.Text = "Hello from Visual Basic 2005"

Selection 对象是用来插入文本的最灵活的方法。自动化 Selection 对象与如何使用 Word 编写一篇文档非常相似,即首先用 Selection 对象将插入点移动到文档中的某一处,然后插入一些文本。以下代码段使用 Selection 对象在文档结尾和起始处插入文本,然后查找单词“Foo”并紧跟其后插入文本。

'首先激活文档axDoc.Activate()'移到末尾并添加文本axWord.Selection.EndKey(Word.WdUnits.wdStory)axWord.Selection.TypeText("This is the end")'移到开头并添加文本axWord.Selection.HomeKey(Word.WdUnits.wdStory)axWord.Selection.TypeText("This is the beginning")axWord.Selection.Find.ClearFormatting()'找到 Foo,然后添加文本'随之axWord.Selection.Find.ClearFormatting()axWord.Selection.Find.Text = "Foo"axWord.Selection.Find.Execute()axWord.Selection.MoveRight(Word.WdUnits.wdCharacter, 1)axWord.Selection.TypeText("This is Foo")

插入表格

插入表格与插入文本相似。以下代码段在文档结尾插入一个 5×5 的表格,将样式应用到表格,并将表格内某单元格的文本替换为“Hello World”。

Dim axTable As Word.TableaxTable = axDoc.Tables.Add(axWord.Selection.Range, 5, 5)axTable.Style = "Table Grid 8"axTable.Cell(3, 3).Range.Text = "Hello World"

打印

要打印文本,请使用 PrintOut 方法:

axDoc.PrintOut()

可靠性

由于在应用程序自动化时用户可能会关闭您的文档——或 Word 本身,因此在尝试自动化文档之前,您需要花时间确认文档仍处于打开状态。完成此任务的一个简单方法便是尝试引用 Document.Name 属性。如果引用 Name 属性引发异常,则说明文档不可用,而且您的应用程序能适当做出反应。以下代码段展示了此项技术:

Dim strName As StringDim blnIsAvailable As BooleanTry    strName = axDoc.Name    blnIsAvailable = TrueCatch ex As Exception    blnIsAvailable = FalseEnd TryMsgBox("Document is available: " & blnIsAvailable)

用数据填充文档

Word 通常用于创建结合了业务数据与人工可读文本的业务文档(如发票和报告)。对使用后端系统数据填充发票和报告来说,自动化是一个很好的机制。示例应用程序展示了三种使用数据填充 Word 文档的有用方法。

将 ADO.NET DataTable 复制到 Word 表格

示例应用程序包括一种可按原样使用或可进行修改的方法,从而将 DataTable 的内容插入 Word 文档内的表格。当您要添加到 Word 文档的数据为表格格式时,这是非常有用的一种机制。以下是 clsWordDoc 类中所含方法的签名:

Function AddDataTable(ByVal tbl As DataTable) As Boolean

内容控件

Word 2007 引入了将数据插入文档的一种新机制,名为“内容控件”。内容控件是可手动编辑、以编程方式填充或用 XML 文件中的数据自动填充的字段。内容控件有九种不同类型,包括文本、图片和组合框。有关如何在 Word 文档中添加和使用内容控件的信息,请参见文章“内容控件”。

通过使用 Document 对象的 ContentControls 集合可引用内容控件。在此代码段中,我们以编程方式将文档第一个内容控件的文本设置为显示“Content Control Field”:

Dim ccCollection As Word.ContentControlsccCollection = axDoc.ContentControlsccCollection.Item(1).Range.Text = " Content Control Field"

图 5. Document 对象的 ContentControls 集合设置文档中的文本“Content Control Field”。

邮件合并

Word 邮件合并用于创建一组个性化的信封或信函,这通过将数据库或文件信息填入文档邮件合并字段来实现。例如,数据库中的名称和地址可用来填充文档中的名称和地址字段。用户执行邮件合并时,Word 会结合源文档和数据库信息,为数据库中的每条记录生成新的个性化信封或信函。邮件合并通常是一个耗时的手动过程。示例应用程序显示了如何自动执行邮件合并,实现整个过程自动化。

执行邮件合并

  1. 打开源文档。
  2. 将“Mail Merge DataSource”(邮件合并数据源)设置为指向数据库。
  3. 生成包含一组信函的一个新文档。

示例应用程序使用以下代码在无用户干预的情况下以无提示方式执行整个过程;

axDoc.Activate()axDoc.MailMerge.MainDocumentType = _Word.WdMailMergeMainDocType.wdFormLettersaxDoc.MailMerge.OpenDataSource(strDatabaseFilename, _wdOpenFormatAuto, False, False, False, False, ", ", _False, ", ", strConnectionString, strSQL, ", False,_Word.WdMergeSubType.wdMergeSubTypeOAL)axDoc.MailMerge.DataSource.FirstRecord = wdDefaultFirstRecordaxDoc.MailMerge.DataSource.LastRecord = wdDefaultLastRecordaxDoc.MailMerge.Destination = _Word.WdMailMergeDestination.wdSendToNewDocumentaxDoc.MailMerge.Execute(False)

虽然示例使这一过程看起来简单,但自动执行邮件合并仍需要仔细配置 DataSourse,原因如下:

  • Word 对使用的连接字符串有些讲究。如果 Word 难以解释其中任一设置,则会打开对话框提示用户手动定义 DataSource。
  • 最容易设置的 DataSource 是 Microsoft Office 地址列表(这正是示例所使用的)。Microsoft Office 地址列表是可通过 Word 2007 创建的 Access 2007 数据库。
  • 其他类型的数据源可用于自动化,而设置 DataSource 设置以确保无提示操作则需要仔细配置。

VBA、自动化和 VSTO

有三种不同的技术可用于 Word 2007 编程:Word 2007 录制宏时仍然能生成的 VBA“代码后隐藏的文档”、用于生成应用程序级加载项的 Visual Studio Tools for Office (VSTO) 以及 Word 自动化。选择如此多样,会让您在考虑何时使用哪种技术时毫无头绪。

每项技术都有它的特殊用途,通过这些用途便可以十分轻松地加以选择:

  • 对于宏,使用 VBA。
  • 对于自动化,使用 Word 自动化(本文中介绍的技术)。
  • 对于应用程序级的加载项,使用 VSTO。

VBA

Visual Basic for Applications (VBA) 是默认的 Word 编程语言。在用户录制宏时,Word 2007 为每一步提供 VBA 代码。这些宏可以添加到工具栏或菜单按钮,并保存在 Word 模板和文档中。尽管 VBA 是基于 COM 的技术、缺少可连接性、安全性和其他基于 .NET 框架语言所拥有的新功能,但对于编写在文档背后运行的宏来说,它仍不失为一种优秀的语言。

自动化

正如我们在本文中所见,Word 自动化是一个通过外部应用程序远程控制 Word 2007 来创建和操作 Word 文档的卓越技术。和 VBA 一样,Word 自动化仍基于 COM 编程模型。

VSTO

Visual Studio Tools for Office (VSTO) 是 Word 编程的最新工具套件。VSTO 2005 SE 是对 Visual Studio 2005 的扩展,可供免费下载(面向 Visual Studio 授权用户),它支持生成 Office 应用程序级的加载项。例如:你可以使用 VSTO 为 Outlook 创建更丰富的任务处理功能。VSTO 支持 Visual Basic 和 C# 编程语言。VSTO 附带一整套托管 API,这样 .NET 开发人员对 Word 编程可以更容易上手。

结束语

在本文中我们介绍了使用 Visual Basic 2005 和自动化来远程控制 Word 2007 的技术。这里我们讨论的仅仅是自动化的一些皮毛——Office 是一个极其丰富的平台,可开发提高信息工作者生产力的解决方案。本系列下一篇文章将讲述如何使用自动化进行更新和定期以电子邮件发送 PowerPoint 报告,并包含如何自动生成图形和图表的介绍。

原创粉丝点击