当书签在表格中时,我如何替换书签文字?

时间:2012-11-07 11:18:33

标签: openxml-sdk

我使用此代码替换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();
}

但这不适用于桌面上的书签。

1 个答案:

答案 0 :(得分:0)

您是否检查过您的方法是否删除了任何书签? 我编辑了一些后你运行了测试代码(你的示例代码中没有var名称项),并且我已经成功地将Hello插入到表中的2个书签中,并且在表中成功地插入了2个,而没有任何的问题。

这让我相信你的问题在别处。 在运行程序后,您是否查看了文档中的open-xml? 有什么错误吗?

我有经验的书签放在单词文档中最奇怪的地方,当你离开单词时,而不是你。

您最终还可以像这样重叠书签

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

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

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

所以上面的例子将成为

<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);
        }
    }
}

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

这将确保您在插入文本时删除元素时不删除bookmarkstart

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