2

我有一个带有 html 标签的 word 文档,需要将其转换为格式化文本。例如,我想<strong>Hello</strong>改为显示为Hello

我以前从未使用过 VBA,但我一直在尝试拼凑一些东西,让我可以从 Word 中的特定表格单元格复制 html 文本,使用 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
4

2 回答 2

0

对于 .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(row,column) 很容易失败,因为它依赖于它们在表中没有合并的单元格。更强大的方法是使用 .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
于 2018-09-17T10:57:09.467 回答
0

尝试以下方式:

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"
于 2018-09-17T22:46:22.787 回答