通过VBA访问富文本到Word:格式化忽略和添加的换行符

时间:2015-03-17 14:29:12

标签: html vba ms-word ms-access-2010

目标

我正在通过VBA将访问数据库中的数据发布到word。正在发布的一些内容采用富文本格式,其中一些内容正在使用HTML进行动态格式化,我使用.InsertFile和一个临时HTML文件来完成此任务。这有效,我可以将数据插入到单词表格中,但我的模板中使用的所有格式都会被忽略。我已经修改了字体大小和系列,但我还要求前/后空格为特定大小和要删除的额外行。

问题

我无法更改使用.InsertFile发布的内容之前或之后的空格,并且在插入内容后总会有一个空白行。

实施例

这是内容在发布时的典型内容。

enter image description here

请注意尾随空格以及列表如何正好对着单元格边框。

这是使用HTML动态生成的内容的示例。

<html>
<ul>
<li>Lorem ipsum dolor sit amet</li>
<li>Lorem ipsum dolor sit amet</li>
<li>etc...</li>
</ul>
</html>

这是在将内容发布到模板之前的样子。

enter image description here

代码

魔法发生的地方,或者说不会发生。 htmlToRich函数检查空值,删除Unicode字符并在保存到临时文件之前将字符串包装在<html></html>标记中

    With oWord.selection
        .Collapse Direction:=wdCollapseEnd
        .Move Unit:=wdCharacter, Count:=-1

        ' Using htmlToRich function, format the string then wrap in
        ' HTML tags
        .InsertFile _
            filename:=htmlToRich("<ul>" & sReference & "</ul>")

        ' Format, unsuccessfully...
        .ParagraphFormat.SpaceBefore = 6
        .ParagraphFormat.SpaceAfter = 6
        .Font.Size = 10
    End With

最后的话

我已经和VBA合作了大约一年了,但格式化词语一直被证明是我的弱点。如果您需要帮助解决此问题,请告知我们。

修改

在插入HTML并设法提出这一点之后,我还有另外一条去除额外的行。

    With oWord.selection
        ' Using htmlToRich function, format the string then wrap in
        ' HTML tags
        .InsertFile _
            filename:=htmlToRich("<ul>" & sReference & "</ul>")
        ' Move the cursor to the end of the cell
        .move wdCharacter
        ' move the cursor back two characters
        .MoveEnd count:=-2
        ' Select the last two cell characters, which should always be a 
        ' line break and a blank cell character.
        .MoveEnd
        ' delete selected
        .Range.Delete
    End With

到目前为止,这在我的所有测试中都很有效,即使它不优雅。这只留给我一个前后空间问题,我似乎无法使用同样的方法修复。我能够选择列表的第一行并应用oWord.Selection.ParagraphFormat.SpaceBefore = 6并且没有进行任何更改。回到绘图板......

2 个答案:

答案 0 :(得分:2)

在解决了尾随换行符之后不久,我找到了一个解决我的空间问题的解决方案。

我创建了一个公共子,允许我格式化文档的表格单元格(我的所有内容都被发布到表格中)。我很可能很快会更新它以删除所有尾随和前导换行符,因为它们可能会导致难看的问题。

Public Sub formatRichText(oWord As Word.Application, oDoc As Word.Document, iTable As Integer, _
    iRow As Integer, iCol As Integer)

    oDoc.Tables(iTable).Cell(iRow, iCol).Select
    ' Delete trailing paragraph character
    With oWord.selection
        .Move wdCharacter
        .MoveEnd wdCharacter, -2
        .MoveEnd
        .Delete
    End With

    oDoc.Tables(iTable).Cell(iRow, iCol).Select
    ' Fix space before
    With oWord.selection
        .Move Count:=-1
        .MoveEnd wdLine
        .ParagraphFormat.SpaceBeforeAuto = False
        .ParagraphFormat.SpaceBefore = 6
    End With

    oDoc.Tables(iTable).Cell(iRow, iCol).Select
    ' fix space after
    With oWord.selection
        .Move Count:=1
        .MoveEnd Count:=-1
        .ParagraphFormat.SpaceAfterAuto = False
        .ParagraphFormat.SpaceAfter = 6
    End With

    oDoc.Tables(iTable).Cell(iRow, iCol).Select
    ' Format font face and size
    With oWord.selection
        .Font.Name = "Arial"
        .Font.Size = 10
    End With

End Sub

我将前/后空格应用于整个选区,但是当应用于列表时,各个项目的间距会调整。

答案 1 :(得分:0)

我试过这个html

<html>
<table width="100%">
<tr>
<td>test1</td><td>test1</td><td>test1</td>
<td rowspan="3">
<ul>
<li>Lorem ipsum dolor sit amet</li>
<li>Lorem ipsum dolor sit amet</li>
<li>etc...</li>
</ul>
</td>
</tr>
<tr>
<td>test1</td><td>test1</td><td>test1</td>
</tr>
<tr>
<td>test1</td><td>test1</td><td>test1</td>
</tr>
</table>
</html>

imported html in word 并且没有额外的段落即将到来。 对于格式化,如果你已经有一个模板,你可以使用单词样式。