我要在带有书签的Word文档的标题中添加文本。
然后突出显示书签的文本。
但是,如果在此之后输入或键入其他一些文本,这些文本也会得到突出显示。
我的代码是:
Word.Document currDocument = WordApp.ActiveDocument;
Word.Selection currentSelection = WordApp.Selection;
if(currentSelection.HeaderFooter.IsHeader)
{
Word.Range selectionRange = currentSelection.Range;
selectionRange.Text ="abc";
currentDocument.Bookmarks.Add("bookmark", selectionRange);
currentDocument.Bookmarks[bookmarkName].Select();
WordApp.Selection.Range.HighlightColorIndex = WdColorIndex.wdBrightGreen;
**//from here I want to set highlight as off**
}
我只想突出显示书签部分。
答案 0 :(得分:2)
使用Selection
对象总是很棘手,应尽可能避免。有时候它会有所帮助,但是在大多数情况下,使用Range
对象是更可靠的。 Selection
几乎反映了用户的工作方式。如果作为用户,您键入某些内容,选择它,应用突出显示,然后再键入一些内容,则您将确切地看到所描述的行为。然后,作为用户,您需要选择键入的内容并删除突出显示-即使突出显示只是一个或两个字符。从那时起,突出显示消失了。无论是作为用户还是试图在代码中模仿它,这都是很痛苦的。
请考虑问题代码中的以下变体。插入书签后,使用Range
属性将第二个Range
对象设置为原始Duplicate
。 (Duplicate
很重要,因为否则两个Range
对象将是相同的-更改一个也会更改另一个。)
第二个Range
对象被移动到原始Range
之后的位置。现在,可以用不同的方式处理两者。与Selection
代码不同,它可以与许多Ranges
一起使用。
Word.Document currDocument = WordApp.ActiveDocument;
Word.Selection currentSelection = WordApp.Selection;
if(currentSelection.HeaderFooter.IsHeader)
{
Word.Range selectionRange = currentSelection.Range;
selectionRange.Text ="abc";
currentDocument.Bookmarks.Add("bookmark", selectionRange);
//currentDocument.Bookmarks[bookmarkName].Select();
Word.Range rngAfterBookmark = selectionRange.Duplicate;
//go to the end of the bookmarked range
rngAfterBookmark.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
//make sure the two ranges are no longer adjacent
rngAfterBookmark.Text = " ";
rngAfterBookmark.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
selectionRange.HighlightColorIndex = WdColorIndex.wdBrightGreen;
}
注意:通常,我什至不会在页眉或页脚中使用Selection
,但会使用页眉或页脚的Range
。我没有更改它,因为直到现在我还不知道代码的逻辑。
答案 1 :(得分:0)
正如Cindy正确提到的那样,应尽可能避免使用Selection。
话虽如此,您需要将wdNoHighLight
应用于非空范围才能生效。
因此,从最后一行开始,以下代码将执行此操作。在您认为合适的时候适应您的需求:
WordApp.Selection.Range.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen;
WordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
WordApp.Selection.MoveRight(Word.WdUnits.wdCharacter, 1, Extend: true);
WordApp.Selection.Range.HighlightColorIndex = Word.WdColorIndex.wdNoHighlight;
WordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
WordApp.Selection.TypeText("YaddaYadda");
您应该看到没有突出显示的“ YaddaYadda”。
一些额外的东西:使用COM对象时,双点(点选择点)通常会引起麻烦。尝试改用替代变量。还要确保使用
Marshal.ReleaseComObject(document);
并在代码结束前释放所有其他Word参考。
编辑:不选择而选择。最简单的方法是在非突出显示的文本上简单地使用替换。为简化起见,我访问了第一页的主标题。
var section = currDocument.Sections.First;
var header = section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary];
var hRange = header.Range.FormattedText;
var highlightedText = "abc";
var normalText = " Yadda yadda";
//insert highlighted text and bookmark
hRange.Text = highlightedText;
currDocument.Bookmarks.Add("bookmark", hRange);
hRange.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen;
//insert normal text, turn off highlighting
hRange.InsertAfter(normalText);
var find = hRange.Find;
find.ClearFormatting();
find.Replacement.ClearFormatting();
find.Text = normalText;
find.Replacement.Text = normalText;
find.Replacement.Highlight = (int) Word.WdColorIndex.wdNoHighlight;
find.Execute(Replace: Word.WdReplace.wdReplaceOne);
Marshal.ReleaseComObject(find);
Marshal.ReleaseComObject(hRange);
Marshal.ReleaseComObject(header);
Marshal.ReleaseComObject(section);