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

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

Я никогда раньше не использовал 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 ]

0 голосов
/ 18 сентября 2018

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

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"
0 голосов
/ 17 сентября 2018

Для двух использований .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).

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

Примертакой код, который удаляет теги 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
...