基于Tagname在Word中查找内容控件

时间:2010-02-24 09:50:00

标签: c# linq openxml

我目前正在尝试使用OpenXml进行一些新的操作,但最近我遇到了一些麻烦。正如标题所说我试图使用Xml动态地将数据插入表中。为了识别我的Worddoc中的表格,我已经在它周围放置了一个富文本内容控件。

一切顺利&看起来很好,直到我试图在我的文档中搜索富文本内容控件的标记名。在运行我的代码时,我不断收到“对象引用未设置为对象的实例。”。

他是发生这种情况的路线:

SdtBlock ccWithTable = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == t.Name).Single();

我已经使用以下MSDN文档尝试实现我的目标,但没有成功:

Inserting Repeating Data Items into a Word 2007 Table by Using the Open Xml API

如果有人能帮助我,我会爱你很久。

1 个答案:

答案 0 :(得分:2)

好的,我已经创建了一个实际上工作得更好的workarround。

首先,我从文档中检索所有表格。

List<Table> tables = mainPart.Document.Body.Descendants<Table>().ToList();

然后我检查SdtBlock的tag-parameter,它是我的Table的父级,看看它们是否匹配。

for (int f = 0; f < tables.Count; f++)
 {
   // If a table is found in the correct Content Control, fill it up with the data
   if (tables.ElementAt(f).Parent.Parent.GetFirstChild<SdtProperties>().GetFirstChild<Tag>().Val == t.Name)
     { //the rest of your code...

t.Name是我想要查找的内容的标记。

我实际上对此结果非常满意,因为这解决了无法填充几个相同表格(在同一文档中,具有相同标签)的事实。

小旁注:如果文档中的其他表格不是动态的,最好尝试捕获if。

tables.ElementAt(f).Parent.Parent.GetFirstChild<SdtProperties>().GetFirstChild<Tag>().Val 

会杀了那些。