Автоматизация Word Mailmerge не работает должным образом
У меня проблема с кодом почтового слияния, который должен генерировать письма в нашем приложении. Я знаю, что в данный момент этот код немного грубоват, но мы находимся в фазе "Получите что-то работающее", прежде чем привести в порядок.
Теперь способ, которым это должно работать, и способ, которым мы работаем, когда мы делаем это вручную, это то, что у нас есть файл (переменная 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
3 ответа
Я нашел решение. Когда вы объединяете документ, он создает новый документ с результатами слияния. Фрагмент кода ниже объясняет.
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)
Один из способов обмануть - записать макрос, вручную выполнив все шаги, которые вы упомянули. Как только вы закончите, настройте макрос, чтобы быть более гибким.
Это то, что я делал в прошлый раз, я не мог понять это, когда писал свои собственные макросы:)
Я думаю, что проблема заключается в этой строке:
wrdDoc.MailMerge.OpenDataSource(templateName)
Таким образом, templateName является чем-то вроде "C:\My Template.doc", верно?
Похоже, вы указываете путь к файлу самого документа Word вместо источника данных (файл Excel или CSV, таблица доступа и т. Д.), Связанного с документом ".template".
Попробуй:
data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)