如何在Word OpenXml部件中映射到可选数据时使节可选?

Ste*_*e B 6 ms-word openxml openxml-sdk

我正在使用OpenXml SDK生成word 2013文件.我正在服务器上运行(服务器解决方案的一部分),因此自动化不是一种选择.

基本上我有一个从后端系统输出的xml文件.这是一个非常简单的例子:

<my:Data 
    xmlns:my="https://schemas.mycorp.com">
    <my:Customer>
        <my:Details>
            <my:Name>Customer Template</my:Name>
        </my:Details>
        <my:Orders>
            <my:Count>2</my:Count>
            <my:OrderList>
                <my:Order>
                    <my:Id>1</my:Id>
                    <my:Date>19/04/2017 10:16:04</my:Date>
                </my:Order>
                <my:Order>
                    <my:Id>2</my:Id>
                    <my:Date>20/04/2017 10:16:04</my:Date>
                </my:Order>
            </my:OrderList>
        </my:Orders>
    </my:Customer>
</my:Data>
Run Code Online (Sandbox Code Playgroud)

然后我使用Word的Xml Mapping窗格将此数据映射到内容控件:

在此输入图像描述

我只是复制word文件,并在生成新文件时编写新的Xml数据.

这是按预期工作的.当我更新xml部分时,它反映了我后端的数据.

想到,有一个案例不起作用.如果客户没有订单,则模板内容将保留在文档中.xml数据是:

<my:Data 
    xmlns:my="https://schemas.mycorp.com">
    <my:Customer>
        <my:Details>
            <my:Name>Some customer</my:Name>
        </my:Details>
        <my:Orders>
            <my:Count>0</my:Count>
            <my:OrderList>
            </my:OrderList>
        </my:Orders>
    </my:Customer>
</my:Data>
Run Code Online (Sandbox Code Playgroud)

(参见空单列表).

在Word中,xml窗格反映了正确的数据(意味着没有Order节点):

用空数据映射

但正如您所看到的,模板内容仍然存在.

基本上,我想在没有订单(或至少是空表)时隐藏订单清单.

我怎样才能做到这一点?

PS:如果它可以提供帮助,我上传了单词和xml文件,以及一个注入数据的小型PowerShell脚本:repro.zip

Tat*_*ead 1

感谢您分享您的文件,以便我们更好地帮助您。

我在尝试使用现有的 Word 内容控件、XML 文件以及将 XML 添加到 Word 文档的 PowerShell 脚本来解决您的问题时遇到了困难。我找到了似乎是Microsoft 的 VSTO 示例解决方案来解决您的问题,但我无法让它正常工作。

不过,我能够编写一个简单的 C# 控制台应用程序,该应用程序根据 XML 数据生成 Word 文件。用于生成 Word 文件的 OpenXML 代码是从 Open XML Productivity Tool 生成的代码。然后,我添加了一些逻辑来读取 XML 文件并根据数据中的订单数量动态生成第二个表行。 如果您对此解决方案感兴趣,我已上传代码供您使用。注意:xml 数据文件应位于 c:\temp 中,生成的 word 文件也将位于 c:\temp 中。

此解决方案的另一个额外好处是,如果您要将所有客户数据添加到一个 XML 文件中,应用程序将在您的临时目录中创建单独的 Word 文件,如下所示:

customer_<name1>.docx

customer_<name2>.docx

customer_<name3>.docx

ETC。

这是从第一个 xml 文件生成的文档 在此输入图像描述

这是从第二个带有空行的 xml 文件生成的文档 在此输入图像描述

希望这可以帮助。