L'automazione di Word Mailmerge non funziona come previsto
-
03-07-2019 - |
Domanda
Sto riscontrando un problema con alcuni codici di stampa unione che dovrebbero produrre lettere all'interno della nostra applicazione. Sono consapevole che al momento questo codice è un po 'approssimativo, ma siamo in " Fai funzionare qualcosa " fase prima di riordinare.
Ora il modo in cui questo dovrebbe funzionare, e il modo in cui funziona quando lo facciamo manualmente, è che abbiamo un file (la variabile fileOut + " .template ") che è un modello per la lettera. Apriamo quel modello, lo uniamo e quindi lo salviamo come nome file nella variabile fileOut.
Tuttavia, ciò che sta facendo è salvare una copia del file modello nel nome fileout, anziché nell'output dell'unione.
Ho cercato e mi sembra di sbattere la testa contro un muro di mattoni.
file di dati è il file di dati che contiene i dati di unione.
Utilizzando gli stessi file, tutto funziona se lo fai manualmente.
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
Soluzione
Ho trovato la soluzione. Quando unisci un documento, crea un nuovo documento con i risultati di unione in esso. Spiegazione del frammento di codice di seguito.
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)
Altri suggerimenti
Penso che il problema sia questa riga:
wrdDoc.MailMerge.OpenDataSource(templateName)
Quindi templateName è qualcosa come 'C: \ My Template.doc', giusto?
Sembra che tu stia fornendo il percorso del file di un documento Word stesso invece di un'origine dati (il file Excel o CSV, la tabella di accesso, ecc.) collegata a " .template " documento.
Prova :
data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
Un modo per imbrogliare è registrare una macro mentre si eseguono manualmente tutti i passaggi menzionati. Al termine, modifica la macro per renderla più flessibile.
È quello che ho fatto l'ultima volta che non sono riuscito a capirlo mentre scrivevo le mie macro :)