Как найти определенный текст в файле слова и программно изменить его с помощью Word Interop? - PullRequest
0 голосов
/ 19 января 2019

Мне нужно найти диапазон слова документа, начиная с определенного текста и заканчивая конкретным текстом, затем я хочу отредактировать этот диапазон в определенном формате. Например, в моем коде у меня есть таблица в документе, заголовок которой начинается с текста {TN}, а таблица заканчивается скрытым текстом {OAEndontribution}. Я хочу заменить текст {TN} на номер таблицы, и когда он находит текст {OAEndontribution}, он должен увеличивать номер таблицы, когда находит следующий {TN}, и это должно продолжаться. В настоящее время я использую объект Word.Range для этого. Но с помощью кода, который я использую, заголовок первой таблицы переносится на следующую страницу, а также отображаемый номер таблицы неверен. Не могли бы вы помочь мне с этим?

     ''' <summary>
''' Format any table heading fields.
''' </summary>
''' <param name="document">PRADocument to work with</param>
Private Shared Sub SetTableFields(document As PRADocument)

    Dim tableNameSearchRange As Word.Range = document.WordDocument.Content

    With tableNameSearchRange
        .TextRetrievalMode.IncludeHiddenText = False
        .TextRetrievalMode.IncludeFieldCodes = False
        .Find.Text = "\{TN*\}?"
        .Find.MatchWildcards = True
        .Find.Forward = True
        .Find.Wrap = Word.WdFindWrap.wdFindStop
    End With

    Dim endOfContributionSearchRange As Word.Range = document.WordDocument.Content

    With endOfContributionSearchRange
        .TextRetrievalMode.IncludeHiddenText = True
        .TextRetrievalMode.IncludeFieldCodes = True
        .Find.Text = Constants.OA_END_CONTRIBUTION
        .Find.MatchWildcards = True
        .Find.Forward = True
        .Find.Wrap = Word.WdFindWrap.wdFindStop
    End With

    Dim isContinuation As Boolean = False
    Dim endOfContributionPosition As Long = 0

    Do

        ' Find the table name field
        tableNameSearchRange.Find.Execute()

        If Not tableNameSearchRange.Find.Found Then Exit Do

        ' Determine if this is continuation of a contribution or the first page of the contribution
        If endOfContributionPosition = 0 OrElse tableNameSearchRange.Start > endOfContributionPosition Then
            isContinuation = False

            endOfContributionSearchRange.Find.Execute()

            If endOfContributionSearchRange.Find.Found Then
                endOfContributionPosition = endOfContributionSearchRange.End
            End If
        Else
            isContinuation = True
        End If

        Dim pg As New OAPage
        pg.CreateFrom(tableNameSearchRange)

        Dim hasSpace As Boolean = (Right(tableNameSearchRange.Text, 1) = " ")

        If Not isContinuation Then

            Dim titleFontName As String = String.Empty
            Dim titleFontSize As Single

            ' Find the font on the paragraph marker so we can set the entire heading later
            With tableNameSearchRange.Duplicate
                .Expand(Word.WdUnits.wdParagraph)
                .Collapse(Word.WdCollapseDirection.wdCollapseEnd)
                .MoveStart(Word.WdUnits.wdCharacter, -1)
                titleFontName = .Font.Name
                titleFontSize = .Font.Size
            End With

            Dim tableName As String = If(pg.Kind = InsertionItemType.Appendix, INSERT_TYPE_APPENDIX, If(pg.Kind = InsertionItemType.Figure, INSERT_TYPE_FIGURE, INSERT_TYPE_TABLE))
            tableNameSearchRange.Text = tableName & " . " & If(hasSpace, String.Empty, " ")

            document.InsertTableOfContentField(tableNameSearchRange, tableName)

        Else

            ' Subsequent pages put in a cross reference
            tableNameSearchRange.Expand(Word.WdUnits.wdParagraph)
            tableNameSearchRange.MoveEnd(Word.WdUnits.wdCharacter, -1)
            tableNameSearchRange.Delete()
            tableNameSearchRange.Text = String.Format(" {0}", Resources.AddInStrings.HeaderContinued)

            ' Put in a style reference
            tableNameSearchRange.Collapse(Word.WdCollapseDirection.wdCollapseStart)
            document.WordDocument.Fields.Add(tableNameSearchRange, Word.WdFieldType.wdFieldStyleRef, String.Format("""{0}""", Constants.ITEM_FOR_TOC), True)

        End If

        tableNameSearchRange.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
        tableNameSearchRange.End = document.WordDocument.Content.End

    Loop

End Sub
...