使用Excel作为数据源并合并为多个.doc文件作为模板,自动化邮件合并。
第一关很好!以下是代码应该如何工作的概述:
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获取一个弹出窗口,询问我使用哪个表,表的列表为空。源数据电子表格未列在弹出窗口的“电子表格”窗口中。上次我遇到这个问题是因为我在不同的机器上打开了源文件,并且由于锁定它不会合并。当此代码爆炸时,我查看任务管理器,并在我的用户名下看到1个或有时2个“EXCEL.EXE * 32”条目。在剩余的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 :(得分:0)
显然我的代码工作了!
在进一步审查后,我发现在任务管理器中仍然运行了WINWORD.EXE * 32。当我切换到该应用程序时,弹出窗口询问我是否要保存或删除恢复的文件...必须是我之前运行中的一个卡在内存中的错误。一旦我告诉Word删除恢复的文件,代码就按预期完成。呼!很高兴这个解决了!