Автоматизация Word Mailmerge не работает должным образом - PullRequest
2 голосов
/ 30 сентября 2008

У меня проблема с кодом почтового слияния, который должен генерировать письма в нашем приложении. Я знаю, что в данный момент этот код немного грубоват, но мы находимся в фазе «Получить что-то работающее», прежде чем мы приведем его в порядок.

Теперь способ, которым это должно работать, и способ, которым мы работаем, когда мы делаем это вручную, это то, что у нас есть файл (переменная 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 ]

4 голосов
/ 01 октября 2008

Я нашел решение. Когда вы объединяете документ, он создает новый документ с результатами слияния. Фрагмент кода ниже объясняет.

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)
0 голосов
/ 30 сентября 2008

Один из способов обмануть - записать макрос, вручную выполняя все шаги, которые вы упомянули. Как только вы закончите, настройте макрос так, чтобы он был более гибким.

Это то, что я делал в прошлый раз, я не мог понять это при написании своего собственного макроса:)

0 голосов
/ 30 сентября 2008

Я думаю, что проблема в этой строке:

wrdDoc.MailMerge.OpenDataSource(templateName)

Итак, templateName - это что-то вроде 'C: \ My Template.doc', верно?

Похоже, вы указываете путь к файлу самого документа Word вместо источника данных (файл Excel или CSV, таблица доступа и т. Д.), Связанного с документом ".template".

Попробуйте :

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
...