Автоматизация 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)
Другие вопросы по тегам