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

时间:2017-04-19 14:23:13

标签: 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>

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

enter image description here

我只是复制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>

(参见空单列表)。

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

mapping with empty data

但正如您所见,模板内容仍在此处。

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

我该怎么做?

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

1 个答案:

答案 0 :(得分:1)

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

我很难用现有的Word内容控件,XML文件和将XML添加到Word文档的PowerShell脚本来解决您的问题。我发现你的问题似乎是Microsoft's VSTO example solution,但我无法干净利落地工作。

然而,我能够编写一个简单的C#控制台应用程序,该应用程序根据您的XML数据生成Word文件。用于生成Word文件的OpenXML代码是从Open XML Productivity Tool生成的代码。然后,我添加了一些逻辑来读取您的XML文件,并根据数据中的订单数量动态生成第二个表行。 I have uploaded the code for you to use if you are interested in this solution。注意:xml数据文件应该在c:\ temp中,生成的word文件也在c:\ temp中。

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

method_to

customer_<name1>.docx

customer_<name2>.docx

这是从第一个xml文件生成的文档 enter image description here

这是从第二个xml文件生成的文档,其中包含空行 enter image description here

希望这有帮助。