范围无法删除。在Microsoft.Office.Interop.Word.Range.set_Text(String prop)

时间:2011-02-10 21:08:55

标签: c# office-interop bookmarks

用文本替换书签的推荐c#.net代码看起来很直接,我在很多网站上看到了相同的代码(包括你的,从2009年9月的帖子开始)然而,我无法获得超过错误

  

无法删除范围。在   Microsoft.Office.Interop.Word.Range.set_Text(字符串   丙)

(我在Windows 7和Word 2010 14.0中使用VS 2010)。

我的代码:

 private void ReplaceBookmarkText(Microsoft.Office.Interop.Word.Document doc, string bookmarkName, string text)
        {
            try
            {
                if (doc.Bookmarks.Exists(bookmarkName))
                {
                    Object name = bookmarkName;
                    //  throws error 'the range cannot be deleted' 
                    doc.Bookmarks.get_Item(ref name).Range.Text = text;
                }
            }

2 个答案:

答案 0 :(得分:9)

不要直接改变范围,而是尝试类似:

Bookmark bookmark = doc.Bookmarks.get_Item(ref name);

//Select the text.
bookmark.Select();

//Overwrite the selection.
wordApp.Selection.TypeText(text);

E.g。使用您的Word应用程序实例来改变文档。

答案 1 :(得分:1)

    if (doc.Bookmarks.Exists(name))
    {
        Word.Bookmark bm = doc.Bookmarks[name];
        bm.Range.Text = text
    }

这有效但请记住,如果以这种方式替换现有书签的整个文本,书签就会消失。无论何时替换现有书签的第一个字符(即使将其替换为已存在的书签),书签也会被使用。我发现的作品(虽然我不认为这是微软批准的方法)是这样的:

    if (doc.Bookmarks.Exists(name))
    {
       Word.Bookmark bm = doc.Bookmarks[name];
       Word.Range range = bm.Range.Duplicate;
       bm.Range.Text = text;                   // Bookmark is deleted, range is collapsed
       range.End = range.Start + text.Length;  // Reset range bounds
       doc.Bookmarks.Add(name, range);         // Replace bookmark
    }