使用VB.NET以编程方式删除Mailmerge数据源
使用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")
显然我的代码工作!
进一步检查后,我发现在任务管理器中仍然运行着WINWORD.EXE * 32。当我切换到该应用程序时,弹出窗口询问我是否想要保存或删除恢复的文件......从我之前运行的内存中卡住的错误之一肯定是错误的。一旦我告诉Word删除恢复的文件,代码将按预期完成。呼!很高兴这个解决了!