1

我使用此代码替换 word 中的书签文本:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("doc3.docx", true))
{

    var bookmarkStarts = wordDoc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();

    foreach (var start in bookmarkStarts)
    {
       OpenXmlElement elem = item.NextSibling();

                while (elem != null && !(elem is BookmarkEnd))
                {
                    OpenXmlElement nextElem = elem.NextSibling();
                    elem.Remove();
                    elem = nextElem;
                }

                item.Parent.InsertBefore<Run>(new Run(new Text("Hello")), item);
    }  
    wordDoc.Close();
}

但这不适用于书签在表格中的位置。

4

1 回答 1

0

您是否检查过您的方法没有删除任何书签?我在稍微编辑后运行了您的测试代码(您的示例代码中没有 var name items),并且我成功地将 Hello 插入到表中的 2 个书签和表中的 2 个中,没有任何问题。

这使我相信您的问题出在其他地方。运行程序后,您是否查看过文档中的 open-xml?有没有错误?

当您将位置留给单词而不是您时,我经历过书签被放置在单词文档中最奇怪的位置。

您也可以像这样使书签相互重叠

<bookmark1 start><xml xml><bookmark2 start><bookmark1 end><xml xml><bookmark2 end>

如果您遇到这种情况,您的代码将在书签开始 2 到达书签结束 1 之前删除它,这将导致您的书签不会被替换。

对于较大的复杂文档,您很容易遇到这个问题。我解决它的方法是在进行任何编辑之前对书签进行“排序”。

所以上面的例子会变成

<bookmark1 start><xml xml><bookmark1 end><bookmark2 start><xml xml><bookmark2 end>

排序后

我用来执行此操作的代码如下所示:

var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>(); 
for (int i = 0; i < bookmarks.Count(); i++)
{
    var bks = bookmarks.ElementAt(i);
    var next = bks.NextSibling();
    if (next is BookmarkEnd)
    {
        var bme = (BookmarkEnd)next;
        if (int.Parse(bks.Id) - int.Parse(bme.Id) == 1)
        {
            var copy = (BookmarkEnd)next.Clone();
            bks.Parent.RemoveChild<BookmarkEnd>(bme);
            bks.Parent.InsertBefore<BookmarkEnd>(copy, bks);
        }
    }
}

我承认这并不完全是万无一失的,但对我来说效果很好。您可以添加的另一项检查,以避免删除书签在您的替换方法中

这将确保您在插入文本时删除元素时不会删除书签开始

while (elem != null && !(elem is BookmarkEnd)) //fjern elementer
            {
                OpenXmlElement nextElem = elem.NextSibling();
                if (elem.LocalName != "bookmarkStart")
                    elem.Remove();
                elem = nextElem;
            }

祝你好运 :)

于 2013-03-27T13:59:32.493 回答