使用 VBA 将带有 HTML 标签的文本呈现为 Word table 中的格式化文本
Rendering text with HTML tags to Formatted text in a Word table using VBA
我有一个带有 html 标签的 word 文档,我需要将其转换为格式化文本。例如,我希望 <strong>Hello</strong>
显示为 Hello。
我以前从未使用过 VBA,但我一直在尝试拼凑一些东西,让我可以从特定的 table 单元格中复制 html 文本Word,使用 IE 显示该文本的格式化版本,从 IE 复制格式化文本,然后将其粘贴回同一个 Word table 单元格。我想我已经能够找出一些代码,但我不认为我指的是正确的 table 单元格。谁能帮忙?这是我目前所拥有的:
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
.cell(2,2) 的两种用途需要两种不同的方法。
要从单元格中获取文本,您需要将第一行修改为阅读
.Document.body.InnerHTML = ActiveDocument.Tables(1).Cell(2, 2).range.text
在第二种情况下,您的术语不正确。应该是
ActiveDocument.Tables(1).Cell(2, 2).range.paste
您可以很容易地获得有关个人 keywords/properties 的帮助。在 VBA IDE 中,只需将光标放在 keyword/property 上,然后按 F1。您将被带到 keyword/property 的 MS 帮助页面。有时,当有多个选择时,您会有一个额外的选择步骤。
您还应该知道 属性 .cell(row,column) 很容易失败,因为它依赖于它们在 Table 中没有合并的单元格。更稳健的方法是使用 .cells(index) 属性.
您可能可以采取替代方法并使用通配符搜索来查找标签,然后在应用合适的链接样式的同时替换您需要的部分(您将无法使用段落样式,因为您将尝试仅格式化段落的一部分,字符样式似乎不适用于 find/replace)。
下面是删除 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 = ""
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 = ""
.Replacement.ClearFormatting
.Text = "\<(u\>)(*)\</"
.Replacement.Font.Underline = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(b\>)(*)\</"
.Replacement.Font.Bold = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(i\>)(*)\</"
.Replacement.Font.Italic = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(h\>)(*)\</"
.Replacement.Highlight = True
.Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
以上宏使用 'normal' HTML 代码来实现粗体、斜体、下划线和突出显示。
由于您的文档似乎使用了不同的约定(也许是样式名称?),例如,您可以将代码中的 (b>) 替换为 (strong>)。而且,如果它打算与 Word 自己的 'Strong' 样式相关,您还可以更改:
.Replacement.Font.Bold = True
至:
.Replacement.Style = "Strong"
我有一个带有 html 标签的 word 文档,我需要将其转换为格式化文本。例如,我希望 <strong>Hello</strong>
显示为 Hello。
我以前从未使用过 VBA,但我一直在尝试拼凑一些东西,让我可以从特定的 table 单元格中复制 html 文本Word,使用 IE 显示该文本的格式化版本,从 IE 复制格式化文本,然后将其粘贴回同一个 Word table 单元格。我想我已经能够找出一些代码,但我不认为我指的是正确的 table 单元格。谁能帮忙?这是我目前所拥有的:
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
.cell(2,2) 的两种用途需要两种不同的方法。
要从单元格中获取文本,您需要将第一行修改为阅读
.Document.body.InnerHTML = ActiveDocument.Tables(1).Cell(2, 2).range.text
在第二种情况下,您的术语不正确。应该是
ActiveDocument.Tables(1).Cell(2, 2).range.paste
您可以很容易地获得有关个人 keywords/properties 的帮助。在 VBA IDE 中,只需将光标放在 keyword/property 上,然后按 F1。您将被带到 keyword/property 的 MS 帮助页面。有时,当有多个选择时,您会有一个额外的选择步骤。
您还应该知道 属性 .cell(row,column) 很容易失败,因为它依赖于它们在 Table 中没有合并的单元格。更稳健的方法是使用 .cells(index) 属性.
您可能可以采取替代方法并使用通配符搜索来查找标签,然后在应用合适的链接样式的同时替换您需要的部分(您将无法使用段落样式,因为您将尝试仅格式化段落的一部分,字符样式似乎不适用于 find/replace)。
下面是删除 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 = ""
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 = ""
.Replacement.ClearFormatting
.Text = "\<(u\>)(*)\</"
.Replacement.Font.Underline = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(b\>)(*)\</"
.Replacement.Font.Bold = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(i\>)(*)\</"
.Replacement.Font.Italic = True
.Execute Replace:=wdReplaceAll
.Replacement.ClearFormatting
.Text = "\<(h\>)(*)\</"
.Replacement.Highlight = True
.Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
以上宏使用 'normal' HTML 代码来实现粗体、斜体、下划线和突出显示。
由于您的文档似乎使用了不同的约定(也许是样式名称?),例如,您可以将代码中的 (b>) 替换为 (strong>)。而且,如果它打算与 Word 自己的 'Strong' 样式相关,您还可以更改:
.Replacement.Font.Bold = True
至:
.Replacement.Style = "Strong"