SurangiTi Ответов: 2

Документ Microsoft Word, В найти пересмотре слова программно .Чистая


С помощью Объект Изменения можно идентифицировать вставленные или удаленные элементы документа. ниже приведен код vb, где при передаче Rang он вернет список доступных объектов RevisionText [text, pageid, lineid и type].

Код делает то, что нужно. Но он очень медленный, так как проходит через все в предоставленном диапазоне (примерно 10000 в диапазоне). Есть ли способ ускорить цикл?
Код Vb или C# - это нормально.

Что я уже пробовал:

<pre>Public Function Revisions(ByVal myRange As Microsoft.Office.Interop.Word.Range) As List(Of RevisionText)
        
        Dim RevisionText As New List(Of RevisionText)
        Try
            For Each oRevision In myRange.Revisions
                Dim ht As RevisionText = New RevisionText()
                If oRevision.Type = Microsoft.Office.Interop.Word.WdRevisionType.wdRevisionInsert Then

                    ht.Text = oRevision.Range.Text
                    ht.PageNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber)
                    ht.LineNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber)
                    ht.Type = "Insert"

                    RevisionText.Add(ht)

                ElseIf oRevision.Type = Microsoft.Office.Interop.Word.WdRevisionType.wdRevisionDelete Then

                    ht.Text = oRevision.Range.Text
                    ht.PageNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber)
                    ht.LineNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber)
                    ht.Type = "Delete"

                    RevisionText.Add(ht)
                End If

            Next oRevision
            Return RevisionText
        Catch ex As Exception
            
            Return RevisionText


        End Try
    End Function

2 Ответов

Рейтинг:
2

Graeme_Grant

Следующее является лишь очень незначительным изменением в том, как работает ваш код, и может дать видимость повышения производительности:

Public Iterator Function Revisions(ByVal myRange As Microsoft.Office.Interop.Word.Range) As IEnumerable(Of RevisionText)
        
    Try
        For Each oRevision In myRange.Revisions
            Dim ht As RevisionText = New RevisionText()
            If oRevision.Type = Microsoft.Office.Interop.Word.WdRevisionType.wdRevisionInsert Then

                ht.Text = oRevision.Range.Text
                ht.PageNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber)
                ht.LineNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber)
                ht.Type = "Insert"

            ElseIf oRevision.Type = Microsoft.Office.Interop.Word.WdRevisionType.wdRevisionDelete Then

                ht.Text = oRevision.Range.Text
                ht.PageNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber)
                ht.LineNo = oRevision.Range.Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber)
                ht.Type = "Delete"

            End If

            Yield ht

        Next oRevision
        'Return RevisionText (left in by mistake - code not tested)

    Catch ex As Exception
        
        Yield Nothing

    End Try

End Function


Теперь вы можете шагать через (повторять) ревизии по одной за раз, а не находить все вхождения сразу, а затем шагать через них.

Подробнее читайте здесь: Реализация итераторов – VB-блог Эрика Уайта[^]


Рейтинг:
0

Jochen Arndt

Я не вижу особых возможностей для оптимизации. Взаимодействие офиса со многими объектами всегда происходит медленно.

Но вы можете попробовать переместить ht объявление вне цикла, чтобы его можно было использовать повторно, а не создавать для каждого объекта.

Вы также можете подумать о том, чтобы изменить ht.Type член числового типа. Не должно быть необходимости использовать строку, когда есть только два возможных значения, и присвоение числового значения намного быстрее, чем присвоение строки.

Также не связано со скоростью:
Почему у вас есть один и тот же оператор return дважды в коде, а не один в конце функции?