【问题标题】:Find Content Control by TagName in Word document in OpenXml在 OpenXml 的 Word 文档中按 TagName 查找内容控件
【发布时间】:2015-07-16 18:05:09
【问题描述】:

我正在尝试使用 OpenXml 将文本插入到我的 word 文档模板中的内容控件中。首先,我通过标签名称搜索内容控件,然后在 SdtBlock 中添加段落元素,如下所示,

SdtBlock contentBlock = wordDoc.MainDocumentPart.Document.Body.Descendants<SdtBlock>()
   .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "AssessmentSection")
   .Single();

但是当我执行此语句时,我得到“对象引用未设置为对象的实例”。错误信息。模板文档已经有另一个内容控件,我能够使用上面相同的语句找到该控件,只是标记名不同。但是在模板中添加“AssessmentSection”内容控件并运行程序后,“AssessmentSection”控件出现“对象引用...”错误,程序失败。我确信新的内容控件标签名称和标题与其他内容控件是唯一的。

谁能帮助我为什么会出现这种奇怪的行为以及如何解决它???

【问题讨论】:

  • 什么是 null?在您的 where 子句中,您有 r.SdtProperties,如果 SdtProperties 对于集合中的任何元素为空,您将获得空引用。如果有可能,请检查:r =&gt; r.SdtProperties != null &amp;&amp; r.SdtProperties.GetFirstChild... 您可能还需要检查GetFirstChild&lt;Tag&gt;() 是否确实为您的所有元素返回了某些内容。如果没有,您也会在那里获得空引用。
  • 看看我的answer here - 有帮助吗?

标签: c# openxml contentcontrol


【解决方案1】:

您还可以循环文档 ContentControls 项目并检查它们的标签,例如:

foreach (Word.ContentControl contentcontrol in wordDoc.ContentControls)
{
   if (contentcontrol.Tag != null)
   {
          ...
   }
}

【讨论】:

  • 不是一个完整的答案,但除了 OPs 问题之外的其他原因可能很有用。这看起来像是来自 Eric White 博客的示例代码的片段:ericwhite.com/blog/…
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多