2008-09-30 68 views
2

我遇到了一些郵件合併代碼的問題,它應該在我們的應用程序中生成字母。我知道這段代碼目前有點粗糙,但在我們收拾整理之前,我們處於「Get something working」階段。自動化Word Mailmerge不按預期方式工作

現在,這是應該的工作方式,它的工作方式,當我們手動做,我們有一個文件(fileOut變量+「。模板」),這是一個字母的模板。我們打開該模板,合併它,然後將它作爲文件名保存在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 

回答

4

我已經找到了解決辦法。當您合併文檔時,它會創建一個合併結果的新文檔。下面的代碼片段解釋。

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

我認爲這個問題是這一行:

wrdDoc.MailMerge.OpenDataSource(templateName) 

所以TEMPLATENAME是像 'C:\我的模版.doc',對不對?

它看起來像你提供的文件路徑中的Word文檔本身,而不是鏈接到「.template」文件數據源(Excel或CSV文件,訪問表等)。

嘗試

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

我澄清一下代碼。該變量是錯誤的,而templateName實際上是數據源。我說代碼很粗糙:) – hulver 2008-10-01 06:56:02

0

一種欺騙方式是錄製宏,而手動做所有你提到的步驟。完成後,調整宏以使其更加靈活。

這就是我所做的最後一次,我無法弄清楚,而我自己寫宏的:)