使用 XML 在 Microsoft Office 2003 中解除信息锁定

Chris Kunicki 和 Charles Maxson
OfficeZealot.com

Frank C. Rice
Microsoft Corporation

适用于:
Microsoft® Office Excel 2003
Microsoft Office Word 2003

摘要:学习使用 ASP.NET 构建的示例 Web 应用程序,该示例将演示如何在创建 Microsoft Office 文档的应用程序外部处理和使用这些文档。

本页内容

概述 概述
关于应用程序 关于应用程序
技术方法 技术方法
准备解决方案 准备解决方案
在运行时创建文档 在运行时创建文档
扩展名隐藏 扩展名隐藏
查看文档 查看文档
解决方案注释 解决方案注释
演示数据 演示数据
附录 A 解决方案设置 附录 A 解决方案设置
附录 B 解决方案演练 附录 B 解决方案演练

本文讨论的文件可以在 Word XML 内容开发工具包 (CDK) 中找到,位于 Office 开发人员中心的 CDK 可帮助开发人员快速熟悉如何将 Word 2003 作为开发平台来构建 XML 解决方案。

概述

本文档提供了 Microsoft Office System 内容开发工具包 (CDK) 附带的解除信息锁定示例解决方案的技术综论。解除信息锁定示例是使用 ASP.NET 构建的基于 Web 的应用程序,该示例将说明如何在 Microsoft®Office System 文档(包括 Microsoft Office Word 2003 文档和 Microsoft Office Excel 2003 电子表格)各自的应用程序外部处理这些文档。此外,该示例还将演示为了在 Microsoft Office 范围外进行使用,如何访问 Office 文档或将其“重新定位用途”。

关于应用程序

解除信息锁定示例应用程序构建在组织经常需要创建大量文档这一概念上。该文档通常是由不断变化的组成员准备的可重复过程的一部分,该过程将行业数据与可反复套用的模板合并,并且需要将其作为文档的组或“项目”来进行管理。

示例可能是一家签下客户保险单的公司。当该公司为客户准备新的保险单或补充现有保险单时,他们要创建一系列组成保险单提供内容的文档。他们可能需要创建封面文档,用于介绍该保险单、时间框架以及接下来的步骤;解释保险单细节的声明页(例如,受益方、定价、折扣和除外事项);然后可能需要包括法律所要求遵守的或免责文档的特定格式。此外,他们还可能要包括通过不同选项对保险单的费用进行细目分类的电子表格,或者在单元格和公式中列出保险精算数据来解释如何确定费率。最后,结果会是一套组成保险单的文档(在本文档的其余部分,我们将其称为“项目”)。

因为很多公司与其客户群共享 Word 和 Excel 文档,所以 Office 是创建这些文档的首选常用工具。此外,很多人需要使用这些文档生成和协作,因此在 Web 服务器上集中管理该应用程序会有重要意义。在服务器上对 Word 和 Excel 进行有意义的操作在过去是有可能的,但由于很多原因这决不是首选。

现在,利用由 Microsoft Office System 提供的 XML 功能和本机文件格式,开发人员可以通过各种方法来解除 Office 数据锁定。在解除信息锁定示例应用程序的这个例子中,利用 Microsoft Office System 创建的文档,以 XML 文件格式进行保存并加载到文档在其中等待处理的 Web 服务器上。当用户对文档进行请求时,应用程序会将文件作为 XML 加载,通过插入业务线和用户驱动数据在服务器上准备文件,然后根据 Word 和 Excel 已经定义的 XSD 架构要求将它们保存为 XML 文件。完成后,正如您期望的那样,用户可以请求从服务器直接以 Word 或 Excel 方式查看和使用这些文件,即使这些文件仍然基于 XML 。

而且,由于 Office 文档只是驻留在服务器上的开放式标准 XML 文件中,用户甚至不需要使用 Office 就可以查看或编辑内容。解除信息锁定示例应用程序允许用户在 Office 外不同于 Office 的视图中查看文档,用户甚至可以在合并项目文档的视图中查看多个文档。而且,用户可以在 Office 外编辑文档,例如添加或更改文档注释。

请注意,所有这些都可以在不要求 Word 或 Excel 可执行文件驻留在服务器上的情况下完成。简单地说,Microsoft Office System 中的 XML 更改了可以构建解决方案的方式。

技术方法

解除信息锁定示例应用程序完全使用 Web 技术构建;使用 Visual Basic.NET 的服务器逻辑提供处理打孔,而 HTML 和 Java Script 用于客户端生成。唯一真正从开发角度使用的 Office 功能是读取和写入 XML 的 Office 新功能。因此,请注意此处已假设您精通 Web 主题,而且本文档的目标是演示如何使用 Office 中的 XML 功能以使应用程序可能类似于此。

准备解决方案

解除信息锁定示例应用程序以相当量的 Web 开发开始。但有了这些强大的支持,添加 Office 内容就非常直接,而且几乎令人难以置信的简单。该应用程序可以使用已经从 Word 或 Excel 中保存为 XML 的任意文档,而且它只是浏览该应用程序根文件夹(称为 OfficeML)的子目录,以查找其将处理的文件。

存储在 Microsoft Access 数据库中的示例应用程序中的一些元数据用于管理该应用程序使用的文档。这些元数据包括可以稍微丰富用户界面的友好名称和文件说明,但是毋庸置疑,您可以忽略它,而且可以让直接加载任意和所有文档的应用程序移除管理的轻量层 - 使用它只是为了更好的演示。

这些文档本身可以是纯文本或复杂文本,甚至可以由用户创建。在使用和产生 Office XML 过程中没有任何实际的规则,只要您遵循架构。在文档内,在几种方法中都是在运行时插入数据,范围从 Word 中的书签、文档属性、字段代码以及 XML 节点到 Excel 中的文档属性和已定义的范围名称。这些用于将文档标记为数据占位符的元素是由作者在文档的设计阶段设置的,并且只要求使用本机 Office 功能。稍后,该应用程序将简单地演示 XML 来识别这些文档对象以便对其进行操作。

在运行时创建文档

当用户在应用程序中请求新文档项目时,会提示他们输入几个数据项并选择他们希望组成新项目的特定文档。

在幕后,该应用程序开始一个将 Office 创建的 XML 文件作为内存 XML Document 对象进行加载的过程。而通过使用 XPath 查询来单独处理每个 XML 文档,以将用户提供的数据插入 XML 文档内的适当节点。

该应用程序包含几个利用特定 XPath 查询设计的不同例程,这些查询针对 Office XML 文档内的不同例程。这些例程包括用于填充项的逻辑,例如,位于 XML 文档内的文档属性、定义的范围、书签和映射的 XML 范围。下面是一个用于在 Word XML 文档中插入文档属性的例程清单:

使用 XPath 将文档属性插入到 WordML 中的例程

Sub WordBuiltInDocProp(ByVal sElement As String, _
    ByVal sValue As String, ByVal xdd As XmlDocument, _
    ByVal nsm As XmlNamespaceManager)
    Dim xddNode As XmlNode = xdd.DocumentElement.SelectSingleNode("/w:wordDocument/ _
o:DocumentProperties/o:" & _
    sElement, nsm)

    If xddNode Is Nothing Then
        Dim xddElement As XmlElement = xdd.CreateElement("o", _ 
    sElement, _
            nsm.LookupNamespace(nsm.NameTable.Get("o")))

        Dim xddNodeParent As XmlNode = xdd.DocumentElement.SelectSingleNode("/w:wordDocument/  _
o:DocumentProperties", nsm)

        xddElement.InnerText = sValue
        xddNodeParent.AppendChild(xddElement)
    Else
        xddNode.InnerText = sValue
    End If

End Sub

实际上,您会发现所有这些例程实际上对于熟悉 XML 和 XPath 的任何开发人员来说都相当简单,一旦您熟悉了通过保存 Word 2003 和 Excel 2003 文档生成的 XML,就可以很容易地扩展和添加自己的内容。该应用程序的所有文档创建代码都可以在称为 Create.aspx.vb 的模块中查看,该模块位于 Visual Studio.NET 的 DocLibrary 项目中的 Create.aspx Web 窗体内。(注:您还可以只在诸如记事本这样的文本编辑器中打开该文件来查看代码。)

扩展名隐藏

在本地计算机上安装 Word 和 Excel 后,Office 就能够检测到 XML 文件是否与两个 Office 应用程序中的任一个相关联,该应用程序允许某个文档使用各自的应用程序启动。但是,当从 Web 服务器使用带有其 .xml 文件扩展名的 Office XML 文件时,该关联并未从本质上作为唯一项被识别,因此浏览器以 XML 文档呈现该页面。这种有益于普通用户的行为并没有必要 - 实际上用户甚至不会知道我们暗地里使用了 XML。

请注意此处的一个小策略,解决这个问题的应用程序掩盖了它产生的 Office XML 文档的文件扩展名。简单地说,就是将 .doc 或 .xls 附加到 XML 文档的文件名(例如,“contract.xml”变成了“contract.xml.doc”)以便在正确的 Office 应用程序中打开该文件。该文件仍然是纯粹 100% 的 XML,但是因为它带有强制扩展名,因而变成了可以在 Office 中直接使用的可下载文件。

查看文档

本文档之前已说明在构建类似于此的应用程序中您所需要的就是 Web 技巧。除非您认为解析 XML 和编写 XSLT 是 Web 技巧(某些开发人员就这么认为),否则前面的论断就不正确。解除信息锁定应用程序大量使用了解析和转换技术,例如 XPath 和 XSLT。当检查应用程序如何对 Office XML 文档“重新定位用途”以在浏览器中使用时,这一点变得尤为明显。

应用程序的设计目标就是为了易于管理和扩展,将所有用于显示 Word 和 Excel 文档的格式逻辑移动到代码外。为此,只要查看由应用程序生成的 Office 文档,它就由 XSLT(可扩展样式表语言转换)来驱动以更改和显示内容。

可在 DocLibrary 项目中的 DetailDocumentTransform.ascx.vb 用户控件内的代码中找到一个很好的示例, DetailDocumentTransform.ascx。当您从 Projects 页面 (http:/<machinename>/DocLibrary/Projects.aspx) 单击某个文档名时,这个用户控件负责生成 Office 文档各自的唯一视图(例如,预览、摘要、样式、备注等等)。通过使用 ASP.NET 中的 XML 服务器控件,该代码可令人难以置信的短小,本质上说可以简缩成关键的两行。一行将控件的 XML 属性设置为 Office XML 文档的属性,另一行将其 XSLT 属性设置为必要的 XSLT,该 XSLT 是在运行时加载自位于根路径的 XSLTforOffice 目录中的 XSLT 文件组。DetailDocumentTransform.ascx 用户控件的代码如下所示:

处理 XML/XSLT 以查看 Office 文档的 VB.NET 代码

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'Prepare the control's client objects
    hypClose.Attributes.Add("onclick", "div_Click(this)")
    hypClose.ID = "hyp_" & nDivID

    Try
        'Set the doc property to the Office XML Document object 
        xmlTransform.Document = xdd

        Manage exceptions for Word Comments and Excel Links
        Select Case nType
            Case Detail.TransformType.Regular
                'Common Transform
                imgAdd.Visible = False
                xmlTransform.TransformSource = sXsl
            Case Detail.TransformType.wdComments
                imgAdd.Visible = True
                imgAdd.Attributes.Add("onclick", "NewNote('"  _
    & sLink & "','" & sType & "')")

                ParameterizedTransform()
                PageTitle = " " & PageTitle

            Case Detail.TransformType.xlLinks
                imgAdd.Visible = False
                ParameterizedTransform()

            End Select

    lblError.Visible = False
Catch
    Err.Clear()
    lblError.Text = "Unable to process the XML " & _
        "transformation for this view."

Finally
    If lblError.Text <> "" Then
        lblError.Visible = True
    End If

End Try
End Sub

'Routine to manage XSLTs that require parameters
Private Sub ParameterizedTransform()
    Dim xslT As New XslTransform()
    xslT.Load(MapPath(sXsl))
    Dim xslArg As XsltArgumentList = New XsltArgumentList()

    xslArg.AddParam("sLink", "", sLink)
    xslArg.AddParam("sType", "", sType)

    xmlTransform.TransformArgumentList = xslArg
    xmlTransform.Transform = xslT

End Sub

如果要检查 Office 文档的整个转换过程,则还要查看 Web 窗体 Detail.aspx 及其模块 Detail.aspx.vb 内的代码。

Office 文档的 XSLT

要真正利用 Office 创建的 XML 的强大功能,您必须能够针对自己的目的而对其进行操作。编写 XSLT 来实现各种功能具有无与伦比的强大和灵活性。尽管为 Word XML 和 Excel XML 编写 XSLT 可能不是容易掌握的技巧,但利用它,您可更改用户查看可以用于多种用途的 Office 文档的方式。下面是使用解除信息锁定示例应用程序的 XSLT 文档示例,该示例仅显示 Word 文档的内置文档属性视图:

用于显示 Word XML 文档的内置文档属性的 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:w="https://schemas.microsoft.com/office/word/2002/8/wordml" 
xmlns:v="urn:schemas-microsoft-com:vml"  _
xmlns:w10="urn:schemas-microsoft-com:office:word" 
xmlns:SL="https://schemas.microsoft.com/schemaLibrary/2002/8/core" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aml="https://schemas.microsoft.com/aml/2001/core" 
xmlns:wx="https://schemas.microsoft.com/office/word/2002/8/auxHint" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<xsl:template match="/">
    <html>
    <head>
    <STYLE type="text/css">
        tblTitle { background-color: #CCCCCC; _ 
            font-weight: bold; border=0 }
        tblData { border-style:solid}
    </STYLE>
    </head>
    <body>
        <xsl:apply-templates select="w:wordDocument/o:DocumentProperties"/>
    </body>
    </html>
</xsl:template>
<xsl:template match="w:wordDocument/o:DocumentProperties">
<table border="1" width="100%">
    <xsl:if test="position()=1">
       <xsl:text disable-output-escaping="yes">&lt;tbody&gt;</xsl:text>
    </xsl:if>
    <tr>
        <td class="tblTitle" width="10%">Title</td>
        <td class="tblData" width="23%">
            xsl:value-of select="o:Title"/>
        </td>
        <td class="tblTitle">Author</td>
        <td class="tblData">
            <xsl:value-of select="o:Author"/>
        </td>
        <td class="tblTitle" width="10%">Category</td>
        <td class="tblData" width="23%">
            <xsl:value-of select="o:Category"/>
        </td>
    </tr>
    <tr>
        <td class="tblTitle">Subject</td>
        <td class="tblData">
            <xsl:value-of select="o:Subject"/>
        </td>
        <td class="tblTitle">Manager</td>
        <td class="tblData">
            <xsl:value-of select="o:Manager"/>
        </td>
        <td class="tblTitle">Keywords</td>
        <td class="tblData">
            <xsl:value-of select="o:Keywords"/>
        </td>
    </tr>
    <tr>
        <td/>
        <td/>
        <td class="tblTitle" width="10%">Company</td>
        <td class="tblData" width="23%">
            <xsl:value-of select="o:Company"/>
        </td>
        <td class="tblTitle">Comments</td>
        <td class="tblData">
            <xsl:value-of select="o:Description"/>
        </td>
    </tr>
    <xsl:if test="position()=last()">
        <xsl:text disable-output-escaping="yes">&lt;/tbody&gt;</xsl:text>
    </xsl:if>
</table>
</xsl:template>
</xsl:stylesheet>

解决方案注释

在开发该应用程序过程中使用的 Office XML 文档、命名空间、XPath 和 XSLT 均设计为与 Microsoft Office System Beta 2 协同工作。尝试利用 Microsoft Office System 的较低版本或较高版本来运行该解决方案可能会产生意外的结果。

演示数据

此外,解除信息锁定示例应用程序提供可配置的数据,该数据可以为演示目的而更改应用程序的上下文和外观。使用 Microsoft Office Access 2003 数据库文件 OfficeML.mdb,您可以通过编辑数据库更改诸如徽标、方案和其他数据元素的设置。

附录 A 解决方案设置

解除信息锁定解决方案所包括的文件使您可以运行完整的解决方案并且可以查看该解决方案的任意相关联的源代码。

系统要求

运行该解决方案需要达到下列系统要求。

  • Microsoft Windows ®XP Professional、带有 Service Pack 2 的 Microsoft Windows 2000 Server、带有 Service Pack 2 或 Microsoft .NET Framework 1.0 的 Microsoft Windows 2000 Professional

  • Internet 信息服务 5.0

  • 可选:用于编辑或查看解除信息锁定 XML Web 服务的 Microsoft Visual Studio .NET 2002。

  • 用于在客户端上查看 Microsoft Office System 内的文档的 Microsoft Office System。

配置系统

安装解除信息锁定示例解决方案主要涉及到配置 Internet 信息服务以运行 ASP.NET 解决方案。

  1. 检查以确保 IIS 中的默认 Web 站点处于运行状态。为此,在控制面板中,打开 Administrative Tools,然后打开 Internet Services Manager(对于 Windows 2000)或 Internet Information Services(对于 Windows XP Professional),将会显示 Internet 信息服务控制台。在左侧窗格中,展开包含您的 Web 服务器名称的节点(如果使用 Windows XP Professional,请展开 Web 站点节点),右键单击 Default Web Site 节点,如果 Start 处于启用状态,则单击它(如果“启动”处于禁用状态,则表明 IIS 处于运行状态)。

  2. 使用 Internet 服务管理器,创建一个名为 DocLibrary 的新虚拟目录。该虚拟目录的目录路径应该设置为示例中的 DocLibrary 文件夹(默认安装在“C:\Program Files\Microsoft Office Beta Documentation\Microsoft Word XML Content Development Kit Beta 2\DocLibrary”中)。此外,该目录应该配置为 IIS 应用程序。单击 Create 按钮,在该虚拟目录的属性对话框内配置该设置。

  3. 如果尚未安装 .NET Framework,请安装 .NET Framework 可重新发布的版本或安装 Microsoft Visual Studio .NET。包括 .NET Framework 的 Visual Studio .NET 正是宿主解除信息锁定 ASP.NET 解决方案所要求的。

在某些系统上,需要用 IIS 注册 ASP.NET。请参阅随 .NET Framework 安装的命令行实用工具:位于 .NET 目录中的 aspnet_regiis.exe。(例如:C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\aspnet_regiis.exe -i)

附录 B 解决方案演练

启动该解决方案

该示例解决方案是一个 Web 解决方案,使用 XML 动态创建一组 Office 文档,随后可以在 Office 应用程序中查看和修改 XML。

  1. 启动 Internet Explorer。

  2. 导航到 http://machinename/doclibrary/。将会出现如图 1 所示的屏幕。

    图 1. 解除信息锁定解决方案的屏幕 1

  3. 在“密码”编辑控件中键入任意字符串,然后单击 Enter。将会出现 Projects Summary 屏幕。

    图 2. 解除信息锁定解决方案的屏幕 2

在该解决方案中,“项目”是重点关注特定客户的文档集合。创建新的项目时,会为特定客户自动创建一个或多个文档。

  1. 单击左侧 Project 菜单中的 New。将会出现以下屏幕。

    图 3. 解除信息锁定解决方案的屏幕 3

  2. 单击放大镜按帐户编号或公司名称列出当前客户

  3. 从“客户”下拉列表中选择一个客户。

  4. 单击“筛选器”图标,并在筛选器文本编辑控件中输入文本。

  5. 单击“应用筛选器”图标。单击“下一步”。

    图 4. 解除信息锁定解决方案的屏幕 4

  6. 选择要创建的一个或多个文档。

  7. 单击 Next

    图 5. 解除信息锁定解决方案的屏幕 5

  8. 键入或选择需要的数据元素。

  9. 单击 Next

    图 6. 解除信息锁定解决方案的屏幕 6

  10. 为项目键入名称。

  11. 单击 Submit。将会出现以下屏幕指示出所创建的文档。

    图 7. 解除信息锁定解决方案的屏幕 7

单击该图标会在相应的应用程序(Word 或 Excel)中打开该文档。单击该文本会在 Microsoft Internet Explorer 中打开该文档,如下图所示:

图 8. 在 Internet Explorer 中打开封面

编者注 这个图像来自于 Microsoft Office System 的 Beta 2 版本,对于最终商业版本,所显示的架构无效。

查看 Office XML 输出

在该项目中创建的 Office 文档是通过生成符合该文档的 Office XML 架构的 XML 文件而动态创建的。要在 Office 应用程序中查看该 XML 文档,您只需单击 Word/Excel 图标。这会将 XML 文档加载到已嵌入在 Internet Explorer 内部的适当的 Office 应用程序中。针对演示目的,还可以查看原始 XML 文件来说明该文档确实是真正的 XML 文件。

  1. 单击 Word/Excel 图标。

  2. 单击该文档名。

  3. 完成后,单击 Close

浏览项目

该解决方案的项目级别可使用户一次同时查看所有文档,而不需要使用相关联的 Office 应用程序每次打开一个文档。

例如,您可以轻松地查看项目内所有文档的摘要。通过从使用 XML 的所有文档中提取已定义的范围“摘要”,就可以实现该操作。

  • 单击左框架的导航菜单中的项目名。

添加/删除项目注释和任务

除仅从一个或多个文档查看信息外,您还可以动态添加与它们相关联的新注释或任务。注释和任务并没有直接存储在文档中,而是存储在与该文档相关联的相关 XML 文件中。

  1. 单击绿色 Go 箭头添加注释或任务。

  2. 单击注释或任务旁边的红色 X 按钮将其删除。

浏览项目内的文档

因为文档是作为 XML 本机存储的,所以文档的特定部分可以分别摘出和显示。例如,在查看文档时,您可以选择查看该文档的不同部分,例如文档内的注释。

  1. 使用导航菜单,单击文档名称。

  2. 在“视图”区域中选中不同的复选框。

  3. 针对不同的文档类型(Word 或 Excel)重复上述操作。

添加/更改文档注释

不仅可以查看文档内的特定部分元素,还可以进行添加或对其进行修改。如果单击“Go”箭头,可以向文档添加一条注释。该注释是通过使用标准的 XML 操作技术修改本机 XML 文件进行添加的。当该文档在 Office 应用程序中打开时,您会看到该注释已经直接添加到了文档中。

  1. 单击左框架的导航菜单中的“项目名”。

  2. 单击绿色 Go 箭头添加新的注释。

  3. Add Comment 窗口中键入注释,然后单击 Go 接受。

  4. 单击 Word 图标。

本机编辑文档

由于 Word 将 XML 用作备选的本机文件格式,您可以直接在 Word 中打开该文件、对其进行更改,然后将其保存回 XML。

然后,使用 Web 解决方案浏览该文档时,您会立即看到对文档所做的更改。

  1. 从 Web 解决方案打开文档。

  2. 修改该文档并将其保存回该站点。

  3. 在 Web 解决方案中浏览到该文档。

转到原英文页面