打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用 SharePoint 2010 Word Automation Services 进行开发

摘要:   学习使用 Word Automation Services 执行服务器端的各种文档格式之间的文档转换。使用 Open XML SDK,您可以完成较为困难的任务,例如更新目录或对文档重新编页。 

上次修改时间: 2011年11月4日

适用范围: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio | Word Autmomation Services

本文内容
使用 Word Automation Services 更改文档格式
单 Word Automation Services 方案
Word Automation Services 的工作方式
配置 Word Automation Services
构建 Word Automation Services 应用程序
监控转换状态
确定转换失败的文档
转换后删除源文件
与 Open XML SDK 集成
结论
其他资源

供稿人: Eric White,Microsoft Corporation | Tristan Davis,Microsoft Corporation | Zeyad Rajabi,Microsoft Corporation

目录

  下载代码(该链接可能指向英文页面)(该链接可能指向英文页面)

使用 欢迎使用 Open XML SDK 2.0 for Microsoft Office 的时候,执行某些任务是比较困难的,例如重新编页、转换至诸如 PDF 之类的其他文档格式,或者更新目录、字段和文档中的其他动态内容。Word Automation Services 是 SharePoint 2010 的一种新功能,其在以上方案中非常有用。此共享服务提供无人参与的、服务器端至其他格式的文档转换,以及许多重要的其他功能项。其最初便是针对在服务器上运行而设计的,并能够以可靠且可预测的方式处理许多文档。

使用 Word Automation Services,您可以从 Open XML WordprocessingML 转换为其他文档格式。例如,您可能希望将许多文档转换为 PDF 格式,并将它们后台打印到打印机或通过电子邮件发送给您的客户。或者,您可以从其他文档格式(例如 HTML 或 Word 97-2003 二进制文档)转换为 Open XML 字处理文档。

除了文档转换工具,Word Automation Services 还提供了许多其他重要的功能领域,例如更新文档中的字段代码和将 altChunk 内容转换为应用普通样式的段落。这些任务使用 Open XML SDK 2.0 执行时可能比较困难。但是,使用 Word Automation Services 执行时则轻而易举。过去,您使用 Word Automation Services 对客户端应用程序执行这些任务。然而,该方法存在着问题。Word 客户端是一款应用程序,最适合于通过交互方式创作文档,而不是针对在服务器上执行大量处理而设计的。执行这些任务时,也许 Word 会显示一个报错的对话框,而且如果 Word 客户端在服务器上正在自动运行,无人对该对话框作出响应,则进程可能会因为超时而停止。与 Word 自动化相关的问题都记录在知识库文章服务器端 Office 自动化注意事项中。

此方案介绍如何使用 Word Automation Services 在服务器上实现文档的自动化处理。

  • 专家创建一些遵循特定约定的 Word 模板文档。她可以使用内容控件来为模板文档赋予结构。这样不仅可以提供良好的用户体验,而且还提供可靠的编程方法用于确定模板文档中在文档生成过程期间应替换数据的位置。这些模板文档通常都存储在 SharePoint 文档库中。

  • 程序在服务器上运行,以将模板文档与数据合并在一起,从而生成一组 Open XML WordprocessingML (DOCX) 文档。该程序最好使用 欢迎使用 Open XML SDK 2.0 for Microsoft Office 进行编写,因此其专用于在服务器上生成文档。这些文档均放置在 SharePoint 文档库中。

  • 生成一组文档之后,可能会自动打印这些文档。或者,可能会在将这些文档从 WordprocessingML 转换为所需格式后,将其作为 WordprocessingML 文档,或者可能作为 PDF、XPS 或 MHTML 文档通过电子邮件发送给一组用户。

  • 在转换过程中,您可以指示 Word Automation Services 更新字段,例如目录。

通过配合使用 欢迎使用 Open XML SDK 2.0 for Microsoft Office 和 Word Automation Services,您可以创建丰富的端对端解决方案,这些解决方案不仅效果不错而且不需要 Word 客户端应用程序的自动化。

Word Automation Services 所具有的关键优势之一就是能根据您的需求进行扩展。与 Word 客户端应用程序不同,您可以对其进行配置以使用多个处理器。另外,您还可以将其配置为在多台服务器之间平衡负载(如果您有这样的需求)。

另外一个关键优势是 Word Automation Services 对于 Word 客户端应用程序具有完美的保真度。不管文档是在服务器还是客户端上进行处理,文档布局(包括分页)都完全一致。

支持的源文档格式

文档受支持的源文档格式如下。

  1. Open XML 文件格式文档(.docx, .docm, .dotx, .dotm)

  2. Word 97-2003 文档(.doc, .dot)

  3. RTF 格式文件 (.rtf)

  4. 单一文件网页(.mht, .mhtml)

  5. Word 2003 XML 文档 (.xml)

  6. Word XML 文档 (.xml)

支持的目标文档格式

支持的目标文档格式包括所有支持的源文档格式,以及以下格式。

  1. 可移植文档格式 (.pdf)

  2. Open XML 纸张规范 (.xps)

Word Automation Services 的其他功能

除了能够以多种格式加载和保存文档以外,Word Automation Services 还包括其他功能。

您可以让 Word Automation Services 更新目录、引文目录和索引字段。这对于生成文档来说非常重要。生成文档之后,如果文档具有目录,为了正确地更新目录需要确定文档的分页,而这恰恰是一项非常困难的任务。Word Automation Services 则能轻松为您解决此困难。

Open XML 字处理文档可以包含各种字段类型,这样可以允许您将动态内容添加到文档中。您可以使用 Word Automation Services 重新计算所有字段。例如,您可以在文档中包括插入当前日期的字段类型。更新字段时,也会更新关联的内容,这样文档便会在该字段的位置显示当前日期。

使用内容控件的有效方式之一就是将它们绑定到自定义 XML 部件的 XML 元素中。请参阅文章使用 Word 2010 和 Word 2007 基于模板构建文档生成系统以了解绑定内容控件的说明,以及帮助您入门的一些资源的链接。您可以通过替换自定义 XML 部件的 XML 来替换绑定内容控件的内容。您无需更改主文档部件。主文档部件包含所有绑定内容控件的缓存值,如果您替换自定义 XML 部件中的 XML,则不会更新主文档部件的缓存值。如果您希望用户仅通过 Word 客户端来查看这些生成的文档,则无需在意该问题。但是,如果您希望深入处理 WordprocessingML 标记,则您必须更新主文档部件中的缓存值。Word Automation Services 可以做到这点。

替换格式内容(例如 altChunk 元素表示的内容)是将 HTML 内容导入 WordprocessingML 文档的极好方式。文章使用 Word 2010 和 Word 2007 基于模板构建文档生成系统针对替换格式内容及其使用进行了讨论,并提供了帮助您入门的链接。但是,在打开和保存包含 altChunk 元素的文档之前,该文档包含 HTML,而非普通的 WordprocessingML 标记,例如段落、运行和文本元素。您可以使用 Word Automation Services 导入 HTML(或其他形式的替换内容)并将它们转换为 WordprocessingML 标记,这些标记包含熟悉的、具有样式的 WordprocessingML 段落。

您还可以在早期版本的 Word 所使用的格式之间进行转换。如果您要建构一款供上千用户使用的企业级应用程序,则可以具有使用 Word 2007 或 Word 2003 编辑 Open XML 文档的用户。您可以转换 Open XML 文档以便它们仅包含 Word 2007 或 Word 2003 所使用的标记和功能。

Word Automation Services 的限制

Word Automation Services 不包括打印文档的功能。但是它能够直接将 WordprocessingML 文档转换为 PDF 或 XPS 并将它们后台打印至打印机。

有时会遇到的一个问题是,是否可以不用购买和安装 SharePoint Server 2010 即可使用 Word Automation Services。Word Automation Services 利用 SharePoint 2010 的工具,且作为其功能而存在。您必须购买和安装 SharePoint Server 2010 才能使用它。Word Automation Services 分标准版本和企业版本。

默认情况下,Word Automation Services 是 SharePoint Server 2010 独立安装下安装和运行的一款服务。如果您要在服务器场中使用 SharePoint 2010,则必须明确启用 Word Automation Services。

若要使用它,您使用其编程界面启动转换作业。对于每个转换作业,您指定希望转换作业处理哪些文件、文件夹或文档库。根据您的配置,当您启动转换作业时,它会在每台服务器上启动指定数量的转换进程。您可以指定它启动转换作业的频率,还可以指定每个转换进程要启动的转换数量。另外,您可以指定 Word Automation Services 可以使用的内存的最大百分比。

通过配置设置,您可以配置 Word Automation Services 以便其不会使用 SharePoint 服务器(您的重要基础结构的一部分)上的过多资源。您必须使用的设置由您使用 SharePoint Server 的方式决定。如果仅将其用于文档转换,则需要配置设置以使转换服务占用您大部分的处理器时间。如果您要将转换服务用于低优先级的后台转换,则需要相应地进行配置。

重要说明

建议将工作进程的数量设置为不超过比服务器上的处理器数少一个的数量。如果您的服务器具有四个处理器,则最多将您的工作进程数量设置为三个。

如果您要运行服务器场安装,则工作进程的数量应设置为比服务器场中处理器数最少的服务器上的处理器数量少一个。

建议您将系统配置为每分钟每个工作进程最多执行 90 个文档转换。

除了编写启动转换进程的代码以外,您还可以编写监控转换进度的代码。这样您可以在完成非常大的转换作业之后通知用户或发布警告结果。

Word Automation Services 允许您配置四种其他方面的转换。

  1. 您可以限制其支持的文件格式的数量。

  2. 您可以在其重新启动之前指定转换进程转换文档的数量。这一点非常有用,因为无效的文档可以导致 Word Automation Services 使用过多的内存。进程重新启动时将回收所有内存。

  3. 您可以指定 Word Automation Services 尝试转换文档的次数。默认情况下,该值被设置为两次,这样如果 Word Automation Services 尝试转换文档失败,则它将仅再尝试一次转换(在该转换作业中)。

  4. 您可以在监控转换进程之前指定运行时间的长度。这点非常有用,因为 Word Automation Services 监控转换以确保转换尚未停止。

除非您安装了服务器场,否则默认情况下,Word Automation Services 安装后即在 SharePoint Server 2010 中启动。然而,作为开发人员,您希望更改其配置,以便获得更好的开发体验。默认情况下,其以 15 分钟的间隔启动转换进程。如果您要测试使用它的代码,则将间隔设置为一分钟是一个不错的选择。在另外一些情况下,您可能希望 Word Automation Services 使用尽可能多的资源。将间隔设置为一分钟对于这些情况来说也是有利的。

将转换进程间隔调整为一分钟

  1. 启动 SharePoint 2010 管理中心。

  2. 在 SharePoint 2010 管理中心的主页上,单击"管理服务应用程序"。

  3. 在"服务应用程序"管理页上,服务应用程序按照字母顺序进行排序。滚动到页面的底部,然后单击"Word Automation Services"。如果您安装的是服务器场并已手动安装 Word Automation Services,您为服务名称所输入的内容即为您在该页面上所看到的内容。

  4. 在 Word Automation Services 的管理页中,将转换吞吐量字段配置为启动转换作业所需的频率。

  5. 作为开发人员,您可能还希望设置转换进程的数量,以及调整每个工作进程的转换数量。如果您调整转换进程启动的频率而不调整其他两个值,并且您尝试转换许多文档,则会使转换进程的效率大幅降低。这三种数量的最佳值应考虑运行 SharePoint Server 2010 的计算机的功率。

  6. 滚动至页面的底部,然后单击"确定"。

由于 Word Automation Services 是 SharePoint Server 2010 的服务,因此您仅能将其用于直接在 SharePoint Server 上运行的应用程序中。您必须将应用程序构建为服务器场解决方案。您无法从沙盒解决方案使用 Word Automation Services。

使用 Word Automation Services 的一种便捷方式是编写您可以从客户端应用程序使用的 Web 服务。

然而,要展示如何编写使用 Word Automation Services 的代码,最简单的方法就是构建控制台应用程序。您必须在 SharePoint Server 上构建和运行控制台应用程序,而不是在客户端计算机上。启动和监控转换作业的代码与您为 Web 部件、工作流或事件处理程序所编写的代码完全一致。通过展示如何从控制台应用程序使用 Word Automation Services,我们可以在不增添 Web 部件、事件处理程序或工作流复杂性的情况下讨论 API。

重要说明

请注意,以下示例应用程序调用 Sleep(Int32),以便这些示例每五秒钟便查询一次状态。如果要在生产服务器上部署您编写的代码,这将不是最佳的方法。相反,您需要编写带有 Delay 活动的工作流。

构建应用程序

  1. 启动 Microsoft Visual Studio 2010。

  2. 在"文件"菜单上,指向"新建",然后单击"项目"。

  3. 在"新建项目"对话框的"最近打开的模板"窗格中,展开"Visual C#",然后单击"Windows"。

  4. 在"最近打开的模板"窗格的右侧,单击"控制台应用程序"。

  5. 默认情况下,Visual Studio 会创建一个面向 .NET Framework 4 的项目。但您必须面向 .NET Framework 3.5。从"打开文件"对话框上部的列表中,选择 .NET Framework 3.5。

  6. 在"名称"框中,键入您要用于项目的名称,例如 FirstWordAutomationServicesApplication。

  7. 在"位置"框中,键入您要放置项目的位置。

    图 1. 在"新建项目"对话框中创建解决方案

  8. 单击"确定"以创建解决方案。

  9. 默认情况下,Visual Studio 2010 创建面向 x86 CPU 的项目,但是若要构建 SharePoint Server 应用程序,您必须面向所有 CPU。

  10. 如果您要构建 Microsoft Visual C# 应用程序,请在"解决方案资源管理器"窗口中,右键单击项目,然后单击"属性"。

  11. 在项目属性窗口中,单击"构建"。

  12. 指向"平台目标"列表,并选择"任何 CPU"。

    图 2. 构建 C# 控制台应用程序时面向任何 CPU

  13. 如果您要构建 Microsoft Visual Basic .NET Framework 应用程序,请在项目属性窗口中,单击"编译"。

    图 3. Visual Basic 应用程序的编译选项

  14. 单击"高级编译选项"。

    图 4."高级编译器设置"对话框

  15. 指向"平台目标"列表,然后选择"任何 CPU"。

  16. 若要添加对 Microsoft.Office.Word.Server 程序集的引用,请在"项目"菜单上,单击"添加引用"以打开"添加引用"对话框。

  17. 选择".NET"选项卡,然后添加名为 Microsoft Office 2010 组件的组件。

    图 5. 添加对 Microsoft Office 2010 组件的引用

  18. 接下来,添加对 Microsoft.SharePoint 程序集的引用。

    图 6. 添加对 Microsoft SharePoint 的引用

以下示例针对最简单的 Word Automation Services 应用程序提供了完整的 C# 和 Visual Basic 列表。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.SharePoint;using Microsoft.Office.Word.Server.Conversions;class Program{    static void Main(string[] args)    {        string siteUrl = "http://localhost";        // If you manually installed Word automation services, then replace the name        // in the following line with the name that you assigned to the service when        // you installed it.        string wordAutomationServiceName = "Word Automation Services";        using (SPSite spSite = new SPSite(siteUrl))        {            ConversionJob job = new ConversionJob(wordAutomationServiceName);            job.UserToken = spSite.UserToken;            job.Settings.UpdateFields = true;            job.Settings.OutputFormat = SaveFormat.PDF;            job.AddFile(siteUrl + "/Shared%20Documents/Test.docx",                siteUrl + "/Shared%20Documents/Test.pdf");            job.Start();        }    }}
注释

将指定给 siteUrl 的 URL 替换为 SharePoint 网站的 URL。

构建和运行示例

  1. 将 Word 文档(名为 Test.docx )添加到 SharePoint 网站中的共享文档文件夹。

  2. 构建和运行示例。

  3. 等待一分钟以便转换进程开始运行,然后导航至 SharePoint 网站中的共享文档文件夹,并刷新页面。文档库中目前包含一个新的 PDF 文档 Test.pdf。

在许多方案中,您希望监控转换的状态,以便在转换进程完成时通知用户,或以其他方式处理转换的文档。可以使用 ConversionJobStatus 类查询 Word Automation Services 有关转换作业的状态。您以字符串形式传递 WordServiceApplicationProxy 类的名称(默认为"Word Automation Services")以及转换作业标识符(其可以从 ConversionJob 对象中获得)。您还可以传递将指定租户分区的 GUID。然而,如果 SharePoint Server 场未针对多个租户进行配置,则您可以作为此形参的实参传递 空 (Visual Basic 中无内容)。

在实例化 ConversionJobStatus 对象之后,您可以访问多个指示转换作业状态的属性。以下三种为最有用的属性。

ConversionJobStatus 属性

属性

返回值

Count

转换作业中当前的文档数量。

Succeeded

成功转换的文档数量。

Failed

转换失败的文档数量。

第一个示例指定转换单个文档,下面的示例则转换指定文档库中的所有文档。您可以选择在与源库不同的文档库中创建所有转换的文档,但为了简单起见,下面的示例为输入和输出文档库指定同一文档库。另外,下面的示例指定转换作业应覆盖已存在的输出文档。

下载代码(该链接可能指向英文页面)(该链接可能指向英文页面)

Console.WriteLine("Starting conversion job");ConversionJob job = new ConversionJob(wordAutomationServiceName);job.UserToken = spSite.UserToken;job.Settings.UpdateFields = true;job.Settings.OutputFormat = SaveFormat.PDF;job.Settings.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;SPList listToConvert = spSite.RootWeb.Lists["Shared Documents"];job.AddLibrary(listToConvert, listToConvert);job.Start();Console.WriteLine("Conversion job started");ConversionJobStatus status = new ConversionJobStatus(wordAutomationServiceName,    job.JobId, null);Console.WriteLine("Number of documents in conversion job: {0}", status.Count);while (true){    Thread.Sleep(5000);    status = new ConversionJobStatus(wordAutomationServiceName, job.JobId,        null);    if (status.Count == status.Succeeded + status.Failed)    {        Console.WriteLine("Completed, Successful: {0}, Failed: {1}",            status.Succeeded, status.Failed);        break;    }    Console.WriteLine("In progress, Successful: {0}, Failed: {1}",        status.Succeeded, status.Failed);}

若要运行此示例,请在共享文档库中添加一些 WordprocessingML 文档。运行此示例时,您会看到与此代码段类似的输出,

Starting conversion jobConversion job startedNumber of documents in conversion job: 4In progress, Successful: 0, Failed: 0In progress, Successful: 0, Failed: 0Completed, Successful: 4, Failed: 0

您可能希望确定哪些文档转换失败,以便通知用户或采取一些补救措施,例如从输入文档库中删除无效的文档。您可以调用 GetItems() 方法,其会返回 ConversionItemInfo() 对象的集合。调用 GetItems() 方法时,您将传递指定是否要检索失败转换或成功转换的集合的参数。下面的示例演示了如何执行此操作。

下载代码(该链接可能指向英文页面)(该链接可能指向英文页面)

Console.WriteLine("Starting conversion job");ConversionJob job = new ConversionJob(wordAutomationServiceName);job.UserToken = spSite.UserToken;job.Settings.UpdateFields = true;job.Settings.OutputFormat = SaveFormat.PDF;job.Settings.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;SPList listToConvert = spSite.RootWeb.Lists["Shared Documents"];job.AddLibrary(listToConvert, listToConvert);job.Start();Console.WriteLine("Conversion job started");ConversionJobStatus status = new ConversionJobStatus(wordAutomationServiceName,    job.JobId, null);Console.WriteLine("Number of documents in conversion job: {0}", status.Count);while (true){    Thread.Sleep(5000);    status = new ConversionJobStatus(wordAutomationServiceName, job.JobId, null);    if (status.Count == status.Succeeded + status.Failed)    {        Console.WriteLine("Completed, Successful: {0}, Failed: {1}",            status.Succeeded, status.Failed);        ReadOnlyCollection<ConversionItemInfo> failedItems =            status.GetItems(ItemTypes.Failed);        foreach (var failedItem in failedItems)            Console.WriteLine("Failed item: Name:{0}", failedItem.InputFile);        break;    }    Console.WriteLine("In progress, Successful: {0}, Failed: {1}", status.Succeeded,        status.Failed);}

若要运行此示例,请创建一个无效文档并将其上载至文档库。创建无效文档的一个简单方法是重命名 WordprocessingML 文档,将 .zip 附加到文件名称之后。然后删除主文档部件(即 document.xml),其位于包的 Word 文件夹中。重命名该文档,移除 .zip 扩展名,这样文档便包含常规的 .docx 扩展名。

运行此示例时,其会生成类似于以下的输出。

Starting conversion jobConversion job startedNumber of documents in conversion job: 5In progress, Successful: 0, Failed: 0In progress, Successful: 0, Failed: 0In progress, Successful: 4, Failed: 0In progress, Successful: 4, Failed: 0In progress, Successful: 4, Failed: 0Completed, Successful: 4, Failed: 1Failed item: Name:http://intranet.contoso.com/Shared%20Documents/IntentionallyInvalidDocument.docx

监控转换进程的另一种方法是使用 SharePoint 列表上的事件处理程序来确定转换文档添加到输出文档库的时间。

在某些情况下,您可能希望在转换后删除源文件。下面的示例演示了如何执行此操作。

下载代码(该链接可能指向英文页面)(该链接可能指向英文页面)

Console.WriteLine("Starting conversion job");ConversionJob job = new ConversionJob(wordAutomationServiceName);job.UserToken = spSite.UserToken;job.Settings.UpdateFields = true;job.Settings.OutputFormat = SaveFormat.PDF;job.Settings.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;SPFolder folderToConvert = spSite.RootWeb.GetFolder("Shared Documents");job.AddFolder(folderToConvert, folderToConvert, false);job.Start();Console.WriteLine("Conversion job started");ConversionJobStatus status = new ConversionJobStatus(wordAutomationServiceName,    job.JobId, null);Console.WriteLine("Number of documents in conversion job: {0}", status.Count);while (true){    Thread.Sleep(5000);    status = new ConversionJobStatus(wordAutomationServiceName, job.JobId, null);    if (status.Count == status.Succeeded + status.Failed)    {        Console.WriteLine("Completed, Successful: {0}, Failed: {1}",            status.Succeeded, status.Failed);        Console.WriteLine("Deleting only items that successfully converted");        ReadOnlyCollection<ConversionItemInfo> convertedItems =            status.GetItems(ItemTypes.Succeeded);        foreach (var convertedItem in convertedItems)        {            Console.WriteLine("Deleting item: Name:{0}", convertedItem.InputFile);            folderToConvert.Files.Delete(convertedItem.InputFile);        }        break;    }    Console.WriteLine("In progress, Successful: {0}, Failed: {1}",        status.Succeeded, status.Failed);}
Console.WriteLine("Starting conversion job")Dim job As ConversionJob = New ConversionJob(wordAutomationServiceName)job.UserToken = spSite.UserTokenjob.Settings.UpdateFields = Truejob.Settings.OutputFormat = SaveFormat.PDFjob.Settings.OutputSaveBehavior = SaveBehavior.AlwaysOverwriteDim folderToConvert As SPFolder = spSite.RootWeb.GetFolder("Shared Documents")job.AddFolder(folderToConvert, folderToConvert, False)job.Start()Console.WriteLine("Conversion job started")Dim status As ConversionJobStatus = _    New ConversionJobStatus(wordAutomationServiceName, job.JobId, Nothing)Console.WriteLine("Number of documents in conversion job: {0}", status.Count)While True    Thread.Sleep(5000)    status = New ConversionJobStatus(wordAutomationServiceName, job.JobId, _                                     Nothing)    If status.Count = status.Succeeded + status.Failed Then        Console.WriteLine("Completed, Successful: {0}, Failed: {1}", _                          status.Succeeded, status.Failed)        Console.WriteLine("Deleting only items that successfully converted")        Dim convertedItems As ReadOnlyCollection(Of ConversionItemInfo) = _            status.GetItems(ItemTypes.Succeeded)        For Each convertedItem In convertedItems            Console.WriteLine("Deleting item: Name:{0}", convertedItem.InputFile)            folderToConvert.Files.Delete(convertedItem.InputFile)        Next        Exit While    End If    Console.WriteLine("In progress, Successful: {0}, Failed: {1}",                      status.Succeeded, status.Failed)End While

将 Word Automation Services 与 欢迎使用 Open XML SDK 2.0 for Microsoft Office 配合使用时,前者的优势变得非常明显。您可以使用 欢迎使用 Open XML SDK 2.0 for Microsoft Office 以编程的方式修改文档库中的文档,然后使用 Word Automation Services 通过 Open XML SDK 执行各种困难的任务。经常会需要通过编程方式生成文档,然后生成或更新文档的目录。请参见下面包含目录的文档。

图 7. 包含目录的文档

假设您要修改该文档,添加应包含在目录中的内容。下一个示例将执行以下步骤。

  1. 打开网站,然后使用 协作应用程序标记语言 (CAML) 查询检索 Test.docx 文档。

  2. 使用 Open XML SDK 2.0 打开文档,在文档的开头添加一个样式为 标题 1 的段落。

  3. 启动转换作业,将 Test.docx 转换为 TestWithNewToc.docx。它将等待转换完成,并报告文档是否转换成功。

下载代码(该链接可能指向英文页面)(该链接可能指向英文页面)

Console.WriteLine("Querying for Test.docx");SPList list = spSite.RootWeb.Lists["Shared Documents"];SPQuery query = new SPQuery();query.ViewFields = @"<FieldRef Name='FileLeafRef' />";query.Query =  @"<Where>      <Eq>        <FieldRef Name='FileLeafRef' />        <Value Type='Text'>Test.docx</Value>      </Eq>    </Where>";SPListItemCollection collection = list.GetItems(query);if (collection.Count != 1){    Console.WriteLine("Test.docx not found");    Environment.Exit(0);}Console.WriteLine("Opening");SPFile file = collection[0].File;byte[] byteArray = file.OpenBinary();using (MemoryStream memStr = new MemoryStream()){    memStr.Write(byteArray, 0, byteArray.Length);    using (WordprocessingDocument wordDoc =        WordprocessingDocument.Open(memStr, true))    {        Document document = wordDoc.MainDocumentPart.Document;        Paragraph firstParagraph = document.Body.Elements<Paragraph>()            .FirstOrDefault();        if (firstParagraph != null)        {            Paragraph newParagraph = new Paragraph(                new ParagraphProperties(                    new ParagraphStyleId() { Val = "Heading1" }),                new Run(                    new Text("About the Author")));            Paragraph aboutAuthorParagraph = new Paragraph(                new Run(                    new Text("Eric White")));            firstParagraph.Parent.InsertBefore(newParagraph, firstParagraph);            firstParagraph.Parent.InsertBefore(aboutAuthorParagraph,                firstParagraph);        }    }    Console.WriteLine("Saving");    string linkFileName = file.Item["LinkFilename"] as string;    file.ParentFolder.Files.Add(linkFileName, memStr, true);}Console.WriteLine("Starting conversion job");ConversionJob job = new ConversionJob(wordAutomationServiceName);job.UserToken = spSite.UserToken;job.Settings.UpdateFields = true;job.Settings.OutputFormat = SaveFormat.Document;job.AddFile(siteUrl + "/Shared%20Documents/Test.docx",    siteUrl + "/Shared%20Documents/TestWithNewToc.docx");job.Start();Console.WriteLine("After starting conversion job");while (true){    Thread.Sleep(5000);    Console.WriteLine("Polling...");    ConversionJobStatus status = new ConversionJobStatus(        wordAutomationServiceName, job.JobId, null);    if (status.Count == status.Succeeded + status.Failed)    {        Console.WriteLine("Completed, Successful: {0}, Failed: {1}",            status.Succeeded, status.Failed);        break;    }}

在使用与本节前面所用文档类似的文档运行此示例之后,将生成一个新文档,如图 8 所示。

图 8. 更新目录后的文档

Open XML SDK 2.0 是一个非常强大的工具,用于构建服务器端文档生成和文档处理系统。但是,文档操作的某些方面是非常困难的,例如文档转换、更新字段和目录等等。Word Automation Services 通过一个高性能的解决方案弥补了这一不足,该解决方案可根据您的要求进行扩展。通过将 Open XML SDK 2.0 和 Word Automation Services 配合使用,可以实现许多仅使用 Open XML SDK 2.0 很难实现的方案。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
(转)C# Office操作
全面展示 微软Office 2007终极评测 - 第13页
使用ABAP操作Excel的几种方法
Office 2010 的功能和优点 - 产品 - Microsoft Office
microsoftoffice
Office 365软件简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服