如何在Word应用程序中将突出显示ColorIndex属性重置为不突出显示

时间:2019-01-28 13:12:15

标签: c# ms-word

我要在带有书签的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**
} 

我只想突出显示书签部分。

2 个答案:

答案 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);