我需要使用Access数据库表中的文本动态生成word文档。需要注意的是,来自数据库的一些文本需要修改为MergeFields。我目前正在使用Interop.Word(VBA Macro)和VB.NET来生成文档。
到目前为止,我的步骤如下:
经过测试,我注意到我不能简单地将MergeFields作为字符串存储到访问数据库中,它们不会反馈到实际文档中。我在想的是创建一个已知字符串的表,应该用编码替换为MergeFields。
例如:
第2步将插入“在@ INACTIVE_DATE之后@您的帐户将不再有效。”这将在数据库文本中。
步骤3将使用MergeField«INACTIVE_DATE»查找/替换@ INACTIVE_DATE @。我正在使用Word Interop执行此操作,因此理论上我可以遍历文档。
我无法从文本到MergeField进行“查找和替换”,那么我该如何实现呢?
另外标记VBA,因为我正在寻找“VBA”式答案(Word Interop)。
答案 0 :(得分:1)
你遗漏了很多细节,所以我会用一般的术语回答这个问题。
你想做的事情绝对是可以实现的。立即想到两种可能的解决方案:
Find
TypeText
Find
假设已插入文本,您可以在文档中搜索给定的模式,并将其替换为合并字段。例如:
Sub FindInsertMerge()
Dim rng As Range
Set rng = ActiveDocument.Range
With rng.Find
.Text = "(\@*\@)"
.MatchWildcards = True
.Execute
If .Found Then
ActiveDocument.MailMerge.Fields.Add rng, Mid(rng.Text, 2, Len(rng.Text) - 2)
End If
End With
End Sub
将找到以@
开头的第一个文本,匹配任何字符串并以@
结尾。然后,找到的范围的内容将被合并字段替换。上面的代码可以很容易地扩展到所有字段的循环。
TypeText
虽然我通常建议不要使用Selection
来插入数据,但这个解决方案很简单。假设您有一个目标范围rng
,您要标记要插入的数据库文本,选择范围,开始输入,每当找到指定的邮件合并字段时,插入一个字段而不是文本。
例如:
Private Sub InsertMergeText(rng As Range, txt As String)
Dim i As Integer
Dim t As String
Dim tokens() As String
tokens = Split(txt, " ")
rng.Select
For i = 0 To UBound(tokens)
t = tokens(i)
If Left(t, 1) = "@" And Right(t, 1) = "@" Then
'Insert field if it's a mail merge label.
ActiveDocument.MailMerge.Fields.Add Selection.Range, Mid(t, 2, Len(t) - 2)
Else
'Simply insert text.
Selection.TypeText t
End If
'Insert the whitespace we replaced earlier.
If i < UBound(tokens) Then Selection.TypeText " "
Next
End Sub
致电示例:
InsertMergeText Selection.Range, "After @INACTIVE_DATE@ your account will no longer be active which will be in the database text."