65.9K
CodeProject 正在变化。 阅读更多。
Home

SOA 方法实现动态 DOCX-PDF 报表生成 - 第 1 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2010年8月7日

CDDL

6分钟阅读

viewsIcon

63184

downloadIcon

1276

在客户端-服务器架构中生成 docx 报表,不使用 MS Office

简介与背景

随着 Microsoft Office 2007 Open XML 格式的出现,Office 报表生成的理念发生了深刻的改变,使其脱离了 Office 本身,并对任何能够读取压缩存档和操作 XML 的编程语言开放。如需进一步阅读,请访问

在本文中,我将说明一种 SOA 方法,用于在分布式环境中生成 Docx 报表,而只需在开发人员机器上安装 MS Office 2007(而不是生产服务器)。该应用程序由以下部分组成:

  1. 一个 ASP.NET 网站
  2. 一个 IIS 托管的 WCF 服务
  3. 一个业务层
  4. 一个数据访问层
  5. 一个数据库

本文的范围仅限于前两个层。使用 Open XML SDK(现为 2.0 版),可以以编程方式读取和写入 Office Open XML 包内部 - 这意味着,可以在不使用 Office COM 对象的情况下读取和写入 Office 文件。这种方法非常快速、简单、资源占用少且稳定。此应用程序中的 WCF 服务必须能够根据现有的 docx 模板和序列化为 XML 的一些数据库数据来创建 Docx 报表。Docx 文件是模块化构建的。为了能够理解这一点,只需重命名一个 docx 文件,将其扩展名更改为“.zip”。要了解此存档的组织结构,请访问 此链接。我们感兴趣的部分称为自定义 XML(请阅读 )。操作 Docx 文件中数据以实现最佳效果的方法是将内容控件绑定到自定义 XML 部分

当公司要求通过 Web 访问一个格式完全符合他们要求的数据库报表时,就产生了对这种系统的需求。他们提供了一个包含示例数据的 docx 样本文档,并期望能够自动生成这些报表。有了这个系统,就不需要痛苦地在 HTML 中复制 Word 格式,因为系统的输入本身就是 docx 模板。该应用程序的未来将涉及 docx 报表的 PDF 转换,这将完全消除在系统中任何地方安装 MS Office 的需要。

1. 生成 docx 模板文档

第一件事是使用 Word 2007 或更高版本构建一个 docx 文档,该文档定义了报表的布局。在此文档中,将包含静态部分(文本块、图像等)和动态部分,这些部分将依赖于数据。首先,我们按照预期格式构建并格式化 docx 文件,使其包含动态数据。然后,当我们对其外观满意后,就可以添加内容控件了。在 Word 的功能区上,我们需要转到“开发工具”选项卡(如果您看不到它,请单击此处了解如何激活它)。在此选项卡中,我们可以找到一些内容控件,例如富文本、纯文本、图像等。现在,我们需要用适当的内容控件替换我们在文档中输入的示例静态数据。

Word ribbon

Word template

2. 创建自定义 XML 部分

使用 Word 2007,我们可以将内容控件放入 docx 文档中,但无法将这些控件绑定到自定义数据。为此,我们需要“手动”修改 docx 存档内的 XML 文件,或遵循更简单的方法,使用像 Word 2007 Content Control Toolkit 这样的工具。此时,我们的 docx 文档不包含任何自定义 XML 部分。我们可以使用 WCCT 创建这些部分。在 WCCT 中打开 docx 文档。在右侧面板中,单击“创建新的自定义 XML 部分”。自定义 XML 部分将被创建,我们可以在“绑定视图”选项卡中看到它。在窗口的左侧,我们将看到对我们在文件中插入的内容控件的引用。单击右侧面板的“编辑视图”选项卡,可以编辑 XML。我们创建的 XML 结构必须是有效的,并且需要与页面上的内容控件相对应。例如:

<documentData>
    <title alias="Title">document title</title>
    <body alias="Body">document body</body>
</documentData>

WCCT 2

完成 XML 创建后,最好通过单击“检查语法”按钮让 WCCT 检查 XML 语法。现在我们可以回到“绑定视图”。我们将能够看到我们刚刚插入的 XML 节点以树状结构显示,接下来将是激动人心的部分。现在,我们将 XML 节点绑定到内容控件,这个过程就像拖放一样简单。选择右侧面板上的一个节点,然后将其拖到文档中某个内容控件的引用上。对所有 XML 节点重复此操作,直到所有内容控件都已绑定到数据。完成后,保存文件并单击“预览”按钮,使用 Word 打开文档。请注意,自定义 XML 数据如何替换了内容控件中的文本。

WCCT 3

WCCT 4

3. 构建 WCF 服务

WCF 服务将用业务逻辑 XML 数据替换 docx 模板中的自定义 XML。使用 Open XML SDK,这实际上非常简单。这是 `replaceCustomXML` 方法:

/// <summary>
/// Replaces the custom XML part inside a docx file with the specified customXML
/// </summary>
/// <param name="docxTemplate">Docx file to modify</param>
/// <param name="customXML">Custom XML part with the 
/// data to insert in the docx document</param>
private void replaceCustomXML(string docxTemplate, string customXML)
{
    try
    {
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(
            docxTemplate, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
           
            mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts);
            //Add a new customXML part and then add content
            CustomXmlPart customXmlPart = mainPart.AddCustomXmlPart(
                 CustomXmlPartType.CustomXml);
            //copy the XML into the new part...
            using (StreamWriter ts = new StreamWriter(customXmlPart.GetStream()))
                ts.Write(customXML);
        }
    }
    catch (Exception ex)
    {
        throw new FaultException("WCF error!\r\n" + ex.Message);
    }
}

4. 构建 ASP.NET 客户端

ASP.NET 客户端将有一个 `template.xml` 文件,该文件复制了服务器 docx 模板中自定义 XML 部分的结构。理想情况下,会有一个网页,自动生成用于输入数据的网页控件,这些控件镜像 XML 模板文件的结构。数据输入后,Web 客户端必须组合一个 XML 文档,该文档遵循现有 `template.xml` 的结构,但用用户输入的数据替换其中的数据。然后,XML `string` 被发送到 WCF 服务,WCF 服务返回 docx 文件的字节。然后,这些字节可以保存在服务器上作为 docx 文件,或者通过 HTTP 直接发送到客户端。

ASP.NET client 1

ASP.NET client 2

5. 值得关注的要点

使用 Office Open XML SDK 2.0 非常简单,它是生成 MS Office 基于报表的革命性方法。

将自定义数据输入 docx 文档的最佳方法是将内容控件绑定到 XML。实际上,微软最初采用了另一种更灵活的方法(将 XML 架构与文档关联),但由于专利侵权问题而停止了。(如果您对此感兴趣,请点击此处阅读更多内容。)在将自定义 XML 绑定到内容控件方面,Word Content Control Toolkit 让工作变得更加轻松。

Office Open XML 格式提供了在不需要与 MS Office 组件交互的情况下生成 MS Office 文档的可能性。这使得构建分布式应用程序成为可能。

敬请期待:此演示应用程序的未来将包括添加 PDF 转换。通过这样做,完全消除了在系统中的任何地方安装 MS Office 的需求,因为 PDF 成为了文档交换格式。

第二部分:一种动态 DOCX-PDF 报表生成的 SOA 方法

© . All rights reserved.