Визуализация текста с тегами HTML в форматированный текст в таблице Word с использованием VBA

У меня есть документ Word с тегами HTML, которые мне нужно преобразовать в форматированный текст. Например, я хотел бы <strong>Hello</strong> вместо этого отображается как Привет.

Я никогда раньше не использовал VBA, но я пытался соединить что-то, что позволило бы мне скопировать HTML-текст из определенной ячейки таблицы в Word, использовать IE для отображения отформатированной версии этого текста, скопировать отформатированный текст из IE, а затем вставьте его обратно в ту же самую ячейку таблицы Word. Я думаю, что мне удалось разобраться с некоторым кодом, но я не думаю, что правильно ссылаюсь на ячейки таблицы. Кто-нибудь может помочь? Это то, что я до сих пор:

Dim Ie As Object

Set Ie = CreateObject("InternetExplorer.Application")

With Ie
    .Visible = False

    .Navigate "about:blank"

    .Document.body.InnerHTML = ActiveDocument.Tables(1).Cell(2, 2)

    .Document.execCommand "SelectAll"

    .Document.execCommand "Copy"

    ActiveDocument.Paste Destination = ActiveDocument.Tables(1).Cell(2, 2)

    .Quit
End With

End Sub

2 ответа

Решение

Вам нужны два разных appraoches для двух использований.cell(2,2).

Чтобы получить текст из ячейки, необходимо изменить первую строку, чтобы читать

.Document.body.InnerHTML = ActiveDocument.Tables(1).Cell(2, 2).range.text  

Во втором случае ваша терминология неверна. Следует читать

ActiveDocument.Tables(1).Cell(2, 2).range.paste

Вы можете получить помощь по отдельным ключевым словам / свойствам довольно легко. В VBA IDE просто наведите курсор на ключевое слово / свойство и нажмите F1. Вы попадете на страницу справки MS по ключевому слову / свойству. Иногда у вас будет дополнительный шаг выбора, когда есть более одной альтернативы.

Вам также следует знать, что свойство.cell (строка, столбец) подвержено сбоям, так как оно основано на том, что в таблице нет объединенных ячеек. Более надежный подход заключается в использовании свойства.cells(index).

Может случиться так, что вы можете использовать альтернативное приближение и использовать поиск по шаблону, чтобы найти тег, а затем заменить нужную часть при применении подходящего связанного стиля (вы не сможете использовать стили абзаца, потому что вы будете пытаться отформатировать похоже, что только часть абзаца и стили символов не работают с функцией поиска / замены).

Ниже приведен пример такого кода, который удаляет теги HTML и форматирует оставшийся текст.

Option Explicit

Sub replaceHTML_WithFormattedText()

' a comma seperated list of HTML tags
Const myTagsList                          As String = "strong,small,b,i,em"

' a list of linked styles chosen or designed for each tag
' Paragraph  styles cannot be used as we are replacing only part of a paragraph
' Character styles just don't seem to work
' The linked styles below were just chosen from the default Word styles as an example
Const myStylesList                        As String = "Heading 1,Heading 9,Comment Subject,Intense Quote,Message Header"

' <, > and / are special characters therefore need escaping with '\' to get the actual character
Const myFindTag                           As String = "(\<Tag\>)(*)(\<\/Tag\>)"
Const myReplaceStr                        As String = "\2"

Dim myTagsHTML()                        As String
Dim myTagsStyles()                      As String
Dim myIndex                             As Long

    myTagsHTML = Split(myTagsList, ",")
    myTagsStyles = Split(myStylesList, ",")

    If UBound(myTagsHTML) <> UBound(myTagsStyles) Then
        MsgBox "Different number of tags and Styles", vbOKOnly
        Exit Sub

    End If

    For myIndex = 0 To UBound(myTagsHTML)

        With ActiveDocument.StoryRanges(wdMainTextStory).Find
            .ClearFormatting
            .Format = True
            .Text = Replace(myFindTag, "Tag", Trim(myTagsHTML(myIndex)))
            .MatchWildcards = True
            .Replacement.Text = myReplaceStr
            .Replacement.Style = myTagsStyles(myIndex)
            .Execute Replace:=wdReplaceAll

        End With

    Next

End Sub

Попробуйте что-то вроде:

Sub ReformatHTML()
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
  .ClearFormatting
  .Format = True
  .Forward = True
  .MatchWildcards = True
  .Wrap = wdFindContinue
  .Replacement.Text = "\2"
  .Replacement.ClearFormatting
  .Text = "\<(u\>)(*)\</\1"
  .Replacement.Font.Underline = True
  .Execute Replace:=wdReplaceAll
  .Replacement.ClearFormatting
  .Text = "\<(b\>)(*)\</\1"
  .Replacement.Font.Bold = True
  .Execute Replace:=wdReplaceAll
  .Replacement.ClearFormatting
  .Text = "\<(i\>)(*)\</\1"
  .Replacement.Font.Italic = True
  .Execute Replace:=wdReplaceAll
  .Replacement.ClearFormatting
  .Text = "\<(h\>)(*)\</\1"
  .Replacement.Highlight = True
  .Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub

Приведенный выше макрос использует "нормальные" HTML-коды для полужирного, курсивного, подчеркивания и выделения.

Поскольку в вашем документе, похоже, используется другое соглашение (возможно, имена стилей?), Вы можете заменить (b>) в коде на (strong>), например. И, если он предназначен для связи с собственным "сильным" стилем Word, вы также изменили бы:

.Replacement.Font.Bold = True

чтобы:

.Replacement.Style = "Strong"
Другие вопросы по тегам