Визуализация текста с тегами 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"