8

我正在寻找一种使用openxml在word doc中的书签后插入一些文本的方法。到目前为止,我已经能够使用以下方法找到书签:

var bookmarks = mainPart.Document.Descendants<BookmarkStart>().ToList();
var bookMarkToWriteAfter = bookmarks.FirstOrDefault(bm => bm.Name == insertAfterBoomark.Name);

word doc 中的此书签是 doc 中两行的选择。我必须在两行选择之后插入一些文本。我尝试使用以下内容插入文本:

var run = new Run();
run.Append(new Text("Hello World"));
bookMarkToWriteAfter .Parent.InsertAfterSelf(run);

mainPart.Document.Save();

然而,这不会产生预期的结果。有谁知道使用openxml在word doc中的书签之后插入文本的正确方法?

4

2 回答 2

9

使用

bookMarkToWriteAfter.Parent.InsertAfterSelf(run);

您正在尝试直接使用 XML,而 OpenXML 并不总是可取的。

试试这个..

    Body body = mainPart.Document.GetFirstChild<Body>();
    var paras = body.Elements<Paragraph>();

    //Iterate through the paragraphs to find the bookmarks inside
    foreach (var para in paras)
    {
        var bookMarkStarts = para.Elements<BookmarkStart>();
        var bookMarkEnds = para.Elements<BookmarkEnd>();


        foreach (BookmarkStart bookMarkStart in bookMarkStarts)
        {
            if (bookMarkStart.Name == bookmarkName)
            {
                //Get the id of the bookmark start to find the bookmark end
                var id = bookMarkStart.Id.Value;
                var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First();

                var runElement = new Run(new Text("Hello World!!!"));

                para.InsertAfter(runElement, bookmarkEnd);

            }
        }
   }
   mainPart.Document.Save();
于 2012-03-19T17:02:22.487 回答
2

您不能假设书签在一个段落中开始和结束。书签可以以不同的元素开始和结束,并且是以下元素的子元素:

bdo (§17.3.2.3); 正文(第 17.2.2 节);评论(§17.13.4.2);customXml (§17.5.1.6); customXml (§17.5.1.4); customXml (§17.5.1.5); customXml (§17.5.1.3); 度(§22.1.2.26);德尔(§17.13.5.14);书房(§22.1.2.28);目录(§17.3.2.8);docPartBody (§17.12.6);e(第 22.1.2.32 节);尾注(§17.11.2);fldSimple(第 17.16.19 节);fName (§22.1.2.37); 脚注(§17.11.10);英尺(§17.10.3);人类发展报告(第 17.10.4 节);超链接(§17.16.22);插件(§17.13.5.18);林(§22.1.2.52);moveFrom(第 17.13.5.22 节);移至(第 17.13.5.25 节);数量(§22.1.2.75);oMath(第 22.1.2.77 节);p(第 17.3.1.22 节);rt(§17.3.3.24);rubyBase (§17.3.3.27); sdt 内容(第 17.5.2.34 节);sdt 内容(第 17.5.2.33 节);sdt 内容(第 17.5.2.35 节);sdt 内容(第 17.5.2.36 节);智能标签(§17.5.1.9);子(§22.1.2.112);支持(§22.1.2.114);tbl(第 17.4.38 节);TC(第 17.4.66 节);tr (§17.4.79)

https://msdn.microsoft.com/en-gb/library/documentformat.openxml.wordprocessing.bookmarkstart(v=office.15).aspx

这意味着在检查所需的 BookmarkEnd 元素时,您需要查看文档中的所有 BookmarkEnd 元素。

Body body = mainPart.Document.GetFirstChild<Body>();
var bookMarkStarts = body.Descendants<BookmarkStart>();
var bookMarkEnds = body.Descendants<BookmarkEnd>();

foreach (BookmarkStart bookMarkStart in bookMarkStarts)
{
    if (bookMarkStart.Name == bookmarkName)
    {
        //Get the id of the bookmark start to find the bookmark end
        var id = bookMarkStart.Id.Value;
        var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First();

        var runElement = new Run(new Text("Hello World!!!"));

        bookmarkEnd.Parent.InsertAfter(runElement, bookmarkEnd);
    }
}
mainPart.Document.Save();

您可能想要检查 Run 是否可以添加到父级并添加到不同的祖先或创建新段落。

(我本来希望将此作为评论添加到 Flowerking 的答案中,但我无法发表评论,因此我在此答案中修改了他们的代码。)

于 2016-11-06T04:07:05.667 回答