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