2016-12-14 79 views
0

使用Excel作为数据源自动化邮件合并并将多个.doc文件合并为模板。使用VB.NET以编程方式删除Mailmerge数据源

第一遍很棒!以下是代码应该如何工作的概述:

1)将数据从SQL Server中提取到Excel中,并保存为网络驱动器上的.xlsx。

2)Excel工作表作为数据源附加到.doc文件,并且成功执行合并。

3)xlWorkbook.Close(),xlApp.Workbooks.Close()和xlApp.Quit()。然后我调用我的垃圾收集例程来使用Marshal.ReleaseComObject释放COM对象,并且它看起来正确关闭了Excel。

4)使用具有不同模板的相同Excel源文件创建下一批字母。

在这一点上,似乎Excel文件先前被用作数据源之后不会从内存释放。当我使用wdAffDoc.MailMerge.OpenDataSource时,我从Word中获得一个弹出窗口,询问我要使用哪个表,并且表的列表为空。源数据电子表格未列在弹出窗口的“电子表格”窗口中。上次我遇到这个问题是因为我的源文件在另一台机器上打开,并且由于锁定原因它不会合并。当这段代码崩溃时,我在任务管理器中查看,并查看我的用户名下列出的“EXCEL.EXE * 32”的1或2个条目。该代码将不会运行,直到剩余的EXCEL.EXE * 32进程终止。

寻找关于我应该去这里的方向的任何输入。我应该怀疑我的垃圾收集程序,还是您认为这是其他事情?

这里是我的垃圾收集:

Public Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

这里是拉源数据后的第一通(按预期工作):

 frmPleaseWait.Label1.Text = "Now merging documents. Please wait." 
     frmPleaseWait.Refresh() 

     Dim wdApp As New Word.Application 
     Dim wdDoc As New Word.Document 

     'Select template based on Queue chosen 
     If Queue = "716" Then 
      wdDoc = wdApp.Documents.Open("X:\Admin\LEGAL\MERGE LETTERS\UPH Vfn 2 Def.doc") 
     End If 

     wdApp.Visible = False 'Set this to False before going live -- true for debugging 

     wdDoc.MailMerge.OpenDataSource(Name:=fileDest, SQLStatement:="SELECT * FROM [Sheet1$]") 'Add a WHERE clause for filtering for affidavits, etc. 

     '.Destination 0 = DOCUMENT, 1 = PRINTER 
     wdApp.ActiveDocument.MailMerge.Destination = 0 'send to new document 
     With wdApp.ActiveDocument.MailMerge.DataSource 
      .FirstRecord = 1 'wdDefaultFirstRecord 
      .LastRecord = -16 'wdDefaultLastRecord 
     End With 
     wdApp.ActiveDocument.MailMerge.Execute(Pause:=False) 

     wdDoc.Close(SaveChanges:=False) 'Close the original mail-merge template file 
     wdApp.ActiveDocument.SaveAs2(savePath & "\" & ProcessDate & " " & Queue & " Verifications.doc") 

     wdApp.Quit() 
     wdDoc = Nothing 
     wdApp = Nothing 

这里是第二(违规)通过:

 Dim wdAffApp As New Word.Application 
     Dim wdAffDoc As New Word.Document 

     If Queue = "716" Then 
      wdAffDoc = wdAffApp.Documents.Open("X:\Admin\LEGAL\MERGE LETTERS\Suit Affidavit 2 Def.doc") 
     End If 

     wdAffApp.Visible = False 'Set this to False before going live -- true for debugging 
'****************THIS IS THE LINE THAT PRODUCES THE ERROR**************** 
     wdAffDoc.MailMerge.OpenDataSource(Name:=fileDest, SQLStatement:="SELECT * FROM [Sheet1$] WHERE [Suit_Bal] >= 5000") 'Add a WHERE clause for filtering for affidavits, etc. 
'************************************************************************ 

     '.Destination 0 = DOCUMENT, 1 = PRINTER 
     wdAffApp.ActiveDocument.MailMerge.Destination = 0 'send to new document 
     With wdAffApp.ActiveDocument.MailMerge.DataSource 
      .FirstRecord = 1 'wdDefaultFirstRecord 
      .LastRecord = -16 'wdDefaultLastRecord 
     End With 
     wdAffApp.ActiveDocument.MailMerge.Execute(Pause:=False) 

     wdAffDoc.Close(SaveChanges:=False) 'Close the original mail-merge template file 
     wdAffApp.ActiveDocument.SaveAs2(savePath & "\" & ProcessDate & " " & Queue & " Affidavits.doc") 

     wdAffApp.Quit() 
     wdAffDoc = Nothing 
     wdAffApp = Nothing 

     'Signal the end 
     frmPleaseWait.Dispose() 
     MsgBox("Mail merge complete") 

回答

0

显然我的代码工作!

进一步检查后,我发现在任务管理器中仍然运行着WINWORD.EXE * 32。当我切换到该应用程序时,弹出窗口询问我是否想要保存或删除恢复的文件......从我之前运行的内存中卡住的错误之一肯定是错误的。一旦我告诉Word删除恢复的文件,代码将按预期完成。呼!很高兴这个解决了!

相关问题