使用c#删除书签的内容,而不删除ms word中的书签

本文关键字:删除 书签 ms word 使用 | 更新日期: 2023-09-27 18:20:17

在ms-word2010中,我有一个书签名为:nameOfBookmark

现在,书签内容可以是任何内容,从文本到图片、表格的混合,以及你想放在word文档中的任何内容。

问题如下:我有我的书签,里面有一些我想删除的内容。然而,每次我试图删除内容时,它也会删除我想要保留的书签。

我试过了,它只是删除了整个东西:

    public void cleanBookmark(string bookmark)
    {
        var start = currentDocument.Bookmarks[nameOfBookmark].Start;
        var end = currentDocument.Bookmarks[nameOfBookmark].End;
        Word.Range range = currentDocument.Range(start, end);
        range.Delete();
    }

我还尝试将范围设置为:

Word.Range range = currentDocument.Range(start +1, end -1);

但后来我得到了一个书签,其中仍然包含我想要删除的内容的第一个和最后一个字符。

使用c#删除书签的内容,而不删除ms word中的书签

我想知道为什么我必须一直回答自己的问题,如果你认为这可能是我提问方式的问题,请通知我。

不管怎样,经过更多的研究,我找到了一个解决方案,我想要的事情似乎根本无法完成,或者至少不是我认为可以完成的方式。

如果您删除了书签的内容,它也会删除书签。因此,您要做的是将书签的名称和范围存储在本地变量中,然后在删除书签后再次添加书签。

    public void cleanBookmark(string bookmark)
    {
        var start = currentDocument.Bookmarks[bookmark].Start;
        var end = currentDocument.Bookmarks[bookmark].End;
        Word.Range range = currentDocument.Range(start, end);
        range.Delete(); 
        //The Delete() only deletes text so if you got tables in the doc it leaves the tables empty. 
        //The following removes the tables in the current range.
        if (range.Tables.Count != 0)
        {
            for (int i = 1; i <= range.Tables.Count; i++)
            {
                range.Tables[i].Delete();
            }
        }
        currentDocument.Bookmarks.Add(bookmark, range);
    }

如果你想阅读更多关于这个主题的内容,请看这个问题。

我发现,如果将文本转换为一个表,并在需要的单元格中插入一个I-beam书签,即使删除了内容,该表也会保护书签。然后,一旦你为表单计算出了所有的vba,如果你将表单转换为dotm,用户就不会有意外删除书签的问题,你必须对表单进行故障排除才能纠正他们的错误。

你可以试试这个:

ActiveDocument.Bookmarks("name").Range.Characters.First.Delete

p.S.
仍在尝试解决多个书签的问题。

当然,很多人也会遇到同样的问题——就像我一样。不同的是,我使用VBA而不是C#)进行编程。经过一些搜索,我找到了最终的解决方案:请参阅The Anchorange(Gregory K.Maxey著)

因此,我设计了以下非常简单的程序:

Sub PasteIntoBookmark_Test()
Dim BookRange As Word.Range, NewText As String, BookName As String
NewText = ""
BookName = "Name"
If ActiveDocument.Bookmarks.Exists(BookName) Then
    Set BookRange = ActiveDocument.Bookmarks(BookName).Range
    Debug.Print BookRange.Text
    BookRange.Text = NewText
    ActiveDocument.Bookmarks.Add BookName, BookRange
    Debug.Print BookRange.Text
    If ActiveDocument.Bookmarks.Exists(BookName) Then
        Debug.Print "Bookmark " & BookName & " still exists"
    Else    ' Just in case the above wouldn't work (but it does):
        With ActiveDocument.Bookmarks
            .Add Range:=BookRange, Name:=BookName
            .DefaultSorting = wdSortByName
            .ShowHidden = False
        End With
    End If
Else
    Stop
End If
End Sub

这样就可以很容易地清除书签而不必删除它!当然,以后可以在这个书签中写入新的文本。