只用分隔字段名原始邮件合并
-
20-09-2019 - |
题
显然,对于我们的应用程序生成基于模板的Word文档正确的方法是鼓励管理员用户(谁将会照顾模板)嵌入正确的合并域或书签模板文件内。
然而,在过去,我们已经找到了我们谁通常不使用邮件合并或任何在Word中其他的“高级”功能,具有使用合并域是显著推迟典型的管理员用户。我们已经尝试做这件事对他们来说,产生的文件,很多截图等,但它是所有的“繁琐”他们。
他们有几十个模板(一切都只是不同类型的非常简单的字母),以及将要修改它们合理频繁。
什么他们真正喜欢的是能够只标注一个简单的分隔符像一个大括号,从而有效地标志着一个自制的合并域到我们的应用程序(虽然话是无视它的意义),如字段:
尊敬的{CustomerSurname}
然后,我们可以只需拿起字段(一个或多个),用几行代码如下所示:
w = New Word.Application
d = w.Documents.Open(...)
Dim mergedContent As String = d.Content.Text
mergedContent = mergedContent.Replace("{CustomerSurname}", Customer.Surname)
mergedContent = mergedContent.Replace("{CustomerPostcode}", Customer.Postcode)
d.Content.Text = mergedContent
这个感觉粗糙,但完美的简单(为最终用户)。
有没有其他人走了这条路?什么错呢?我们会建议他们不要在文档的普通文本的其他地方使用“{”和“}”字符,但是这不是一个真正的显著限制。
速度?包裹在两行合并域?其他的问题?
解决方案
这是我的代码的一部分,我用于查找和替换。我第一次尝试你的代码,但没有奏效。这是基于该字时录制宏生成VBA代码。
range = document.Range()
With range.Find
.Text = "{" & name & "}"
.Replacement.Text = NewValueHere
.Forward = True
.Wrap = Word.WdFindWrap.wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
range.Find.Execute(Replace:=Word.WdReplace.wdReplaceAll)
我用这个代码,因为所需要的文件,以与Office二进制文件格式兼容。如果您可以使用Office 2007格式,你不需要安装Word。只要解压缩文件,查找单词\ document.xml中的文件,做一个String.Replace("[OldValue]", "New value")
,保存文件和zip回一个包(DOCX文件)。
我这里显示的代码是非常缓慢的,因为我在Word进行自动化。打开Word,编辑2个文件用6个字段和关闭应用程序需要在我的电脑4秒。
其他提示
如果用户不希望使用大括号?我想你应该提供一种方式来逃避他们,例如/{/}
或{{}}
等。
您需要确保您的更换逻辑的情况下,例如不敏感两种{CustomerSurname}和{} Customersurname应该允许代表相同的字段。甚至可以可选地允许像{顾客姓}单词之间的空格。