4

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

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

但是我如何找到一个特定的表?桌子可以改变,所以我不能依赖订单。我正在考虑在特定表格之前放置一个书签,然后在书签之后找到第一个表格,但我没有找到如何做到这一点......

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

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

4

4 回答 4

11

给表格标题。

首先在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;
    }
}
于 2013-03-20T17:58:42.357 回答
3

本文描述了一个使用内容控件的简洁解决方案:

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

于 2014-03-17T17:25:05.703 回答
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
于 2013-04-03T08:15:35.390 回答
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

于 2013-03-20T11:52:25.993 回答