自动化Word Mailmerge无法按预期工作
时间:2020-03-06 14:55:48 来源:igfitidea点击:
我的一些邮件合并代码有问题,该代码应该在我们的应用程序中产生字母。我知道目前此代码有些粗糙,但是在整理之前,我们处于"使某些事情能够正常工作"的阶段。
现在,该方法的工作方式以及手动进行操作时的工作方式是,有了一个文件(fileOut变量+" .template"),该文件是字母的模板。我们打开该模板,将其合并,然后将其另存为fileOut变量中的文件名。
但是,它正在做的是将模板文件的副本保存到fileout文件名中,而不是合并的输出中。
我搜寻了一下,似乎在把头撞在砖墙上。
数据文件是包含合并数据的数据文件。
使用相同的文件,如果我们手动进行操作,则所有操作均有效。
Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String Dim ans As String = String.Empty errorLog = "C:\Temp\Template_error.log" If (File.Exists(datafile)) Then Try ' Create an instance of Word and make it invisible.' wrdApp = CreateObject("Word.Application") wrdApp.Visible = False ' Add a new document.' wrdDoc = wrdApp.Documents.Add(fileOut & ".template") wrdDoc.Select() Dim wrdSelection As Word.Selection Dim wrdMailMerge As Word.MailMerge wrdDoc.MailMerge.OpenDataSource(datafile) wrdSelection = wrdApp.Selection() wrdMailMerge = wrdDoc.MailMerge() With wrdMailMerge .Execute() End With wrdDoc.SaveAs(fileOut) wrdApp.Quit(False) ' Release References.' wrdSelection = Nothing wrdMailMerge = Nothing wrdDoc = Nothing wrdApp = Nothing ans = "Merged OK" Call writeToLogFile(errorLog, "This worked, written to " & fileOut) Catch ex As Exception ans = "error : exception thrown " & ex.ToString Call writeToLogFile(errorLog, ans) End Try Else ans = "error ; unable to open Date File : " & datafile If (logErrors) Then Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _ "to process it. Filename provided: " & datafile) End If End If Return ans End Function
解决方案
我认为问题是此行:
wrdDoc.MailMerge.OpenDataSource(templateName)
所以templateName类似于" C:\ My Template.doc",对吗?
看起来我们提供的是Word文档本身的文件路径,而不是链接到" .template"文档的数据源(Excel或者CSV文件,Access Table等)。
尝试:
data = "C:\My Data.xls" wrdDoc.MailMerge.OpenDataSource(data)
作弊的一种方法是在手动执行我们提到的所有步骤时记录宏。完成后,请调整宏以使其更加灵活。
这就是我上次做的,我在编写自己的宏时无法弄清楚:)
我找到了解决方案。合并文档时,它将创建一个包含合并结果的新文档。下面的代码片段进行了说明。
wrdDoc = wrdApp.Documents.Add(TemplateFileName) wrdDoc.Select() Dim wrdSelection As Word.Selection Dim wrdMailMerge As Word.MailMerge wrdDoc.MailMerge.OpenDataSource(DataFileName) wrdSelection = wrdApp.Selection() wrdMailMerge = wrdDoc.MailMerge() With wrdMailMerge .Execute() End With ' This is the wrong thing to do. It just re-saves the template file you opened. ' 'wrdDoc.SaveAs(OutputFileName) ' ' The resulting merged document is actually stored ' ' in the MailMerge object, so you have to save that ' wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName) wrdApp.Quit(False)