Использование Selection.Find в Microsoft.Office.Interop.Word для поиска отслеженных изменений в документе
В настоящее время я использую приведенный ниже код в приложении VB.Net, чтобы найти конкретный текст в документе Word. Текст окружен символами, представленными кодами символов в выражении. Text. Код ниже работает нормально. Проблема в том, что иногда нужный текст в документе помечается для удаления и отображается как отслеженное изменение в документе. Я хотел бы найти только нужный текст, который НЕ был помечен для удаления. Кто-нибудь знает способ определить, является ли найденный текст удалением?
xSelection.MoveStart(Word.WdUnits.wdStory)
xSelection.Find.ClearFormatting()
xSelection.Find.Replacement.ClearFormatting()
With xSelection.Find
.Text = ChrW(65000) & "( \[*)" & ChrW(65001)
.Replacement.Text = ""
.Forward = True
.Wrap = Word.WdFindWrap.wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With
xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)
Do While xSelection.Find.Found
........Execute additional code here
Loop
3 ответа
Попробуйте отключить отображение ревизий перед поиском или обработкой документа Word:
document.ShowRevisions = false;
Он сохраняет отслеживание изменений в документе, если он присутствует, но позволяет вам видеть и справляться только с новейшим контентом, например, без каких-либо удалений и т. Д.
Для меня это работает, чтобы установить окончательный вид ревизии до поиска. Затем будет найден только текст, видимый в окончательной ревизии (вы можете сделать резервную копию предыдущего значения и восстановить представление после завершения поиска):
ActiveDocument.Windows(1).View.RevisionsView = wdRevisionsViewFinal
Полный код:
' set view to show final document revision
' to prevent deleted text from being found
Word.WdRevisionsView revisionsView = xSelection.Document.Windows(1).View.RevisionsView
xSelection.Document.Windows(1).View.RevisionsView = Word.WdRevisionsView.wdRevisionsViewFinal
xSelection.MoveStart(Word.WdUnits.wdStory)
xSelection.Find.ClearFormatting()
xSelection.Find.Replacement.ClearFormatting()
With xSelection.Find
.Text = ChrW(65000) & "( \[*)" & ChrW(65001)
.Replacement.Text = ""
.Forward = True
.Wrap = Word.WdFindWrap.wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With
xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)
Do While xSelection.Find.Found
........Execute additional code here
Loop
' restore previous view
xSelection.Document.Windows(1).View.RevisionsView = revisionsView
Я закончил цикл каждой ревизии и изменил цвет шрифта удаленных ревизий, чтобы отличать их от не удаленных комментариев следующим образом:
For Each xRevision In theDoc.Revisions
If xRevision.Type = Word.WdRevisionType.wdRevisionDelete Then
xRevision.Range.Font.Color = Word.WdColor.wdColorBlack
End If
Next
Затем я могу выполнить поиск и обработать найденные комментарии по-разному в зависимости от их цвета шрифта:
xSelection.MoveStart(Word.WdUnits.wdStory)
xSelection.Find.ClearFormatting()
xSelection.Find.Replacement.ClearFormatting()
With xSelection.Find
.Text = ChrW(65000) & "( \[*)" & ChrW(65001)
.Replacement.Text = ""
.Forward = True
.Wrap = Word.WdFindWrap.wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With
xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)
Do While xSelection.Find.Found
If xSelection.Font.Color = Word.WdColor.wdColorAutomatic Then
.....
End If
xSelection.Find.Execute()
Loop