gpt4 book ai didi

c# - 在 C# 的 OpenXml SDK 中使用 MergeField FieldCodes 时,为什么字段代码会消失或碎片化?

转载 作者:行者123 更新时间:2023-11-30 16:53:50 25 4
gpt4 key购买 nike

我已经使用 C# OpenXml SDK(来自 NuGet 的非官方 Microsoft Package 2.5)成功工作了一段时间,但最近注意到以下代码行返回不同的结果,具体取决于 Microsoft Word 在何时出现的心情文件被保存:

var fields = document.Descendants<FieldCode>();

据我所知,首先创建文档时(在 Windows 8.1 上使用 Word 2013)如果您使用 Insert->QuickParts->Field 并从 Field names 左侧 Pane 中选择 MergeField,然后提供a 字段属性中的字段名称,然后单击“确定”,然后字段代码将按照我的预期正确保存在文档中。

然后,当使用上述代码行时,我将收到 1 个字段的字段代码计数。如果我随后编辑此文档(甚至单独保留此字段),则后续保存可能意味着我的查询中不再返回此字段代码。

同样好奇的另一个例子是当我看到 FieldCode 节点拆分为多个项目时。所以与其说:

" MERGEFIELD  Author  \\* MERGEFORMAT "

作为节点名称,我将看到:

" MERGEFIELD  Aut"
"hor \\* MERGEFORMAT"

拆分为两个 FieldCode 节点值。我不知道为什么会这样,但这确实使我匹配节点的能力更加令人兴奋。这是预期的行为吗?一个已知的错误?在我了解发生了什么之前,我真的不想破解原始 xml 并编辑此文档。非常感谢大家。

最佳答案

我自己遇到了这个问题,并找到了一个存在于 OpenXML 中的解决方案:一个名为 MarkupSimplifier 的实用程序类,它是 PowerTools for Open XML 项目的一部分。使用此类解决了我遇到的您描述的所有问题。

The full article is located here.

以下是一些相关的摘录:

Perhaps the most useful simplification that this performs is to merge adjacent runs with identical formatting.

接着说:

Open XML applications, including Word, can arbitrarily split runs as necessary. If you, for instance, add a comment to a document, runs will be split at the location of the start and end of the comment. After MarkupSimplifier removes comments, it can merge runs, resulting in simpler markup.

正在使用的实用程序类的示例是:

SimplifyMarkupSettings settings = new SimplifyMarkupSettings
{
RemoveComments = true,
RemoveContentControls = true,
RemoveEndAndFootNotes = true,
RemoveFieldCodes = false,
RemoveLastRenderedPageBreak = true,
RemovePermissions = true,
RemoveProof = true,
RemoveRsidInfo = true,
RemoveSmartTags = true,
RemoveSoftHyphens = true,
ReplaceTabsWithSpaces = true,
};
MarkupSimplifier.SimplifyMarkup(wordDoc, settings);

我已经使用 VS2015 .Net Framework 4.5.2 在 Word 2010 文档中多次使用它,它让我的生活变得非常非常轻松。

更新:

我重新访问了这段代码,发现它在 MERGEFIELDS 上运行时会清除,但不会在引用合并字段的 IF FIELDS 上清除,例如

{if {MERGEFIELD When39} = "Y???" "Y" "N" }

我不知道为什么会这样,对底层 XML 的检查没有提供任何提示。

关于c# - 在 C# 的 OpenXml SDK 中使用 MergeField FieldCodes 时,为什么字段代码会消失或碎片化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com