【问题标题】:How to make a section optional when mapped to optional data in a Word OpenXml Part?映射到 Word OpenXml 部件中的可选数据时,如何使部分可选?
【发布时间】:2017-04-19 14:23:12
【问题描述】:

我正在使用 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 映射窗格将此数据映射到内容控件:

我只是简单的复制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 节点):

但是如你所见,模板内容还在。

基本上,当没有订单(或至少是一个空表)时,我想隐藏订单列表。

我该怎么做?

PS:如果有帮助,我上传了 word 和 xml 文件,以及一个注入数据的小 PowerShell 脚本:repro.zip

【问题讨论】:

  • 当然 - 请上传文档。
  • @Taterhead: 瞧,它已经上传了

标签: ms-word openxml openxml-sdk


【解决方案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 文件,如下所示:

customer_&lt;name1&gt;.docx

customer_&lt;name2&gt;.docx

customer_&lt;name3&gt;.docx

等等

这是从第一个 xml 文件生成的文档

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

希望这会有所帮助。

【讨论】:

  • 非常感谢您为解决我的问题所做的努力。然而,生成词 ML 实际上并不是一种选择。我没有描述整个解决方案来简化问题,但在应用程序中,用户可以编辑文档模板(添加品牌、选择列等)。 XML 数据来自可以产生任意数据集的查询系统。单词模板文件必须与 XML 数据匹配。一切都是手动设置的,每一代文档的实例(并且特定于我们运送产品的每个客户)
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2011-08-19
  • 1970-01-01
  • 2021-01-15
  • 2022-07-15
  • 1970-01-01
  • 2020-12-06
  • 2022-12-03
相关资源
最近更新 更多