在open xml中查找特定的表(在书签之后)

时间:2013-03-20 10:10:06

标签: c# openxml

我有一个包含多个表格的文档。 我需要填写其中一些表格。 我遇到的问题是如何找到它们? 我可以通过他们进行互动

var doc = document.MainDocumentPart.Document;
var tables= doc.Body.Elements< Table >();

但我如何找到特定的表?表格可以改变,所以我不能依赖订单。 我想把书签放在特定的桌子前面,然后找到书签后面的第一张桌子,但是我找不到怎么做...

那么,如何在文档中找到特定的表?

如果有更好的方法,请告诉我。

4 个答案:

答案 0 :(得分:5)

给表格标题。

首先在Word中创建表格,然后右键单击其中一个表格,表格属性,替换文字,填写标题框,保存,关闭。

现在在OpenXML中,找到包含特定字幕的表格。

IEnumerable<TableProperties> tableProperties = bd.Descendants<TableProperties>().Where(tp => tp.TableCaption != null);
foreach(TableProperties tProp in tableProperties)
{
    if(tProp.TableCaption.Val.Equals("myCaption")) // see comment, this is actually StringValue
    {
        // do something for table with myCaption
        Table table = (Table) tProp.Parent;
    }
}

答案 1 :(得分:1)

对于这个更优雅的解决方案,使用bookmarkstart作为定位器将是

BookmarkStart bookmark = YourBookMarkStart;
OpenXmlElement elem = bookmark.First().Parent;
//isolate tabel
while (!(elem is DocumentFormat.OpenXml.Wordprocessing.Table))
    elem = elem.Parent;
var table = elem; //found

答案 2 :(得分:1)

本文介绍了使用内容控件的简洁解决方案:

http://msdn.microsoft.com/en-us/library/cc197932(v=office.12).aspx

答案 3 :(得分:0)

我找到了解决方案。 这不是我提出的最漂亮的解决方案,但似乎有效。至少在我试过的文件上。

我创建了我的桌子。 在表格的任何位置插入书签,然后找到书签。

var bookmarkStart = doc.Body.Descendants<BookmarkStart>().Where(r => r.Name == "tableBookmark");
if (bookmarkStart != null)
{
    var test  = bookmarkStart.First().Parent.Parent.Parent.Parent;
    if (test.GetType() == typeof (DocumentFormat.OpenXml.Wordprocessing.Table))
        myTable = (Table)test;
}

请随时给我一个更好的解决方案! :) 例如,我可能会创建一个递归方法来查找表而不是使用Parent.Parent.Parent.Parent