【问题标题】:Add rows to a table dynamically in existing word document using OpenXml使用 OpenXml 将行动态添加到现有 Word 文档中的表中
【发布时间】:2017-04-27 21:58:43
【问题描述】:

我正在使用 OpenXml 处理 word 文档。现在我的 word 文档 (docx) 宽度标题中有两个表格,现在我需要向这些表格添加动态行。

【问题讨论】:

  • 我没有尝试任何添加行的方法,我不知道使用哪种方法。

标签: c# ms-word openxml tabular


【解决方案1】:

好的,这应该对您有所帮助。我确信还有其他方法可以向现有表中添加行,但这是我使用的方法。

我假设在这个例子中,你的表头正好是 1 行。在这个例子中,我在 Word 的表格中放置了一个名为“table”的书签。在桌子上的哪个位置并不重要,因为我正在通过 Parent 挖掘直到我到达桌子。

我原来的word文档:

用 cmets 解释它的代码:

//setup
using (var wordDoc = WordprocessingDocument.Open(@"C:\test\cb\exptable.docx", true))
{
    MainDocumentPart mainPart = wordDoc.MainDocumentPart;
    var document = mainPart.Document;
    var bookmarks = document.Body.Descendants<BookmarkStart>();

    //find bookmark
    var myBookmark = bookmarks.First(bms => bms.Name == "table");
    //dig through parent until we hit a table
    var digForTable = myBookmark.Parent;
    while(!(digForTable is Table))
    {
        digForTable = digForTable.Parent;
    }
    //get rows
    var rows = digForTable.Descendants<TableRow>().ToList();
    //remember you have a header, so keep row 1, clone row 2 (our template for dynamic entry)
    var myRow = (TableRow)rows.Last().Clone();
    //remove it after cloning.
    rows.Last().Remove();
    //do stuf with your row and insert it in the table
    for (int i = 0; i < 10; i++)
    {
        //clone our "reference row"
        var rowToInsert = (TableRow)myRow.Clone();
        //get list of cells
        var listOfCellsInRow = rowToInsert.Descendants<TableCell>().ToList();
        //just replace every bit of text in cells with row-number for this example
        foreach(TableCell cell in listOfCellsInRow)
        {
            cell.Descendants<Text>().FirstOrDefault().Text = i.ToString();
        }
        //add new row to table, after last row in table
        digForTable.Descendants<TableRow>().Last().InsertAfterSelf(rowToInsert);
    }
}

运行代码后的文档:

这应该可以解决问题。

【讨论】:

  • 我可以不用任何技巧来解决这个问题吗?以及如何直接访问word文档中的表格?
  • 表表 = doc.MainDocumentPart.Document.Body.Elements().First();这段代码sn-p在word文档中找到第一个表,用这种方式我可以找到第二个,第三个表,不是吗?
  • ... 是吗?我不完全确定你在问什么,你能用我的答案吗?是的,您可以使用您的代码 sn-p 查找第一个表,因为它是 Body 的子表。如果它在段落或其他内容中,而不是直接子项,则可以使用 Descendants
  • ,就像我在示例中所做的那样。
猜你喜欢
相关资源
最近更新 更多
热门标签