使用 VBA 将带有 HTML 标签的文本转换为 Word 中的格式化文本

Converting text with HTML tags to formatted text in Word using VBA

提问人:Kris 提问时间:9/19/2023 最后编辑:Kris 更新时间:9/20/2023 访问量:62

问:

分页符中带有问号的框我正在使用 HTML 标签修改 Word 中的文本,以将其更改为 Word 识别的格式。下面的代码是我到目前为止所拥有的,但我希望对其进行修改以包含以下内容:

  1. 将所有内容格式化为特定尺寸和格式(例如,Calibri 尺寸 11)。
  2. 识别换行符 (<br>) 并与实际换行符交换。
  3. 不仅要识别粗体或下划线,还要识别同时使用两者的情况。
Sub ReformatHTML()
    Application.ScreenUpdating = False
    With ActiveDocument.Range.Find
        .ClearFormatting
        .Format = True
        .Forward = True
        .MatchWildcards = True
        .Wrap = wdFindContinue
        ' Remove <p>
        .Replacement.Text = "\2"
        .Replacement.ClearFormatting
        .Text = "\<(p\>)(*)\</\1"
        .Execute Replace:=wdReplaceAll
        .Replacement.Text = "\2"
        .Replacement.ClearFormatting
        .Text = "\<(u\>)(*)\</\1"
        .Replacement.Font.Underline = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(strong\>)(*)\</\1"
        .Replacement.Style = "Strong"
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(i\>)(*)\</\1"
        .Replacement.Font.Italic = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(h\>)(*)\</\1"
        .Replacement.Highlight = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        ' line break
        .Replacement.Text = vbCrLf
        .Replacement.ClearFormatting
        .Text = "\<br\>"
        .Execute Replace:=wdReplaceAll
    End With
    
    With ActiveDocument.Range
        .Font.Name = "Calibri"
        .Font.Size = 11
    End With
    
    Application.ScreenUpdating = True
End Sub


到目前为止,除了我询问的修改之外,我所拥有的代码运行良好。标题为使用 VBA 将带有 HTML 标签的文本呈现为 Word 表格中的格式化文本的帖子在一定程度上有所帮助,但我仍在苦苦挣扎,无法提出后续问题。

这是我尝试修改的文本示例(我无法弄清楚如何使用文本并且没有将 HTML 转换为格式,所以我包含一张图片......呃):

在此处输入图像描述

html vba ms-word

评论

1赞 Charles Kenyon 9/19/2023
为什么不简单地在浏览器中查看,然后复制并粘贴到 Word 合并格式中?

答:

0赞 taller 9/19/2023 #1

恳请尝试。

Sub ReformatHTML()
    Application.ScreenUpdating = False
    With ActiveDocument.Range.Find
      .ClearFormatting
      .Format = True
      .Forward = True
      .MatchWildcards = True
      .Wrap = wdFindContinue
      ' replace <u>
      .Replacement.Text = "\2"
      .Replacement.ClearFormatting
      ' set font style
      .Replacement.Font.Name = "Calibri"
      .Replacement.Font.Size = 11
      .Text = "\<(u\>)(*)\</\1"
      .Replacement.Font.Underline = True
      .Execute Replace:=wdReplaceAll
      ' line break
      .Replacement.Text = vbCr
      .Replacement.ClearFormatting
      .Text = "\<br\>"
      .Execute Replace:=wdReplaceAll
    End With
    Application.ScreenUpdating = True
End Sub

enter image description here


更新

删除标签 <p> 并在 OP 上与代码集成

Sub ReformatHTML()
    Application.ScreenUpdating = False
    With ActiveDocument.Range.Find
        .ClearFormatting
        .Format = True
        .Forward = True
        .MatchWildcards = True
        .Wrap = wdFindContinue
        ' Remove <p>
        .Replacement.Text = "\2"
        .Replacement.ClearFormatting
        .Text = "\<(p\>)(*)\</\1"
        .Execute Replace:=wdReplaceAll
        .Replacement.Text = "\2"
        .Replacement.ClearFormatting
        .Text = "\<(u\>)(*)\</\1"
        .Replacement.Font.Underline = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(strong\>)(*)\</\1"
        .Replacement.Style = "Strong"
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(i\>)(*)\</\1"
        .Replacement.Font.Italic = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        .Replacement.ClearFormatting
        .Text = "\<(h\>)(*)\</\1"
        .Replacement.Highlight = True
        .Replacement.Font.Name = "Calibri"
        .Replacement.Font.Size = 11
        .Execute Replace:=wdReplaceAll
        ' line break
        .Replacement.Text = vbCrLf
        .Replacement.ClearFormatting
        .Text = "\<br\>"
        .Execute Replace:=wdReplaceAll
    End With
    Application.ScreenUpdating = True
End Sub

为整个文档设置字体样式,然后和不是必需的。.Replacement.Font.Name.Replacement.Font.Size

    With ActiveDocument.Range.Font
        .Name = "Calibri"
        .Size = 11
    End With

评论

0赞 Kris 9/19/2023
非常感谢。这让我离得更近了一点。我尝试将您的代码与我已经拥有的内容一起包含,但我仍然感到困惑。我编辑了我的帖子,以包含我正在处理的文本类型的屏幕截图。不幸的是,我无法弄清楚如何在没有堆栈溢出的情况下仅粘贴文本,将 HTML 标签转换为实际格式。此外,还有一些字符(<p>,</p>)我似乎无法摆脱。
0赞 taller 9/19/2023
请仔细检查您的样本文档。 第一个 </strong> 是 overlap w/ <p> 标签。是否要删除所有 p 标签?
0赞 Kris 9/19/2023
谢谢你,taller_ExcelHome。第一个</strong>与 <p> 重叠只是因为用户在 Excel 中进行了大量更新而发生的事情,这很麻烦,他们不会听我的。但是,是的,我希望删除所有 <p> 标签,因为它们似乎与此任务无关紧要。当我尝试删除它们时,只会删除“p”,但“</>”字符会保留。不知道为什么?
0赞 taller 9/20/2023
我已经更新了代码。
0赞 Kris 9/20/2023
哇,太感谢你了。我做了一个调整并粘贴了上面的代码,以便能够使整个文档的 Calibri 大小为 11。唯一剩下的就是在所有有分页符的情况下,分页间距看起来是正确的;然而,留下的是里面有问号的盒子。我将在上面添加另一个屏幕截图,标题为“带有分页符问号的框”。