【发布时间】:2017-05-05 19:54:36
【问题描述】:
尝试使用 VB.NET 和 Excel 作为数据源和 Word 文档作为主文档进行邮件合并。
无论我尝试过什么,EXCEL.EXE *32 都会在任务管理器中保持运行。我需要它退出,以便我可以重新使用相同的 Excel 文件作为数据源,以便在同一程序中进行后续合并。
下面是代码的调用方式:
SourceFile = CreateSourceFile(Queue, F.SelectedPath)
这导致我的函数 CreateSourceFile:
Public Function CreateSourceFile(ByVal Queue As String, ByVal PathToSave As String)
'Creates suit data source file and returns the full path to the file location
Dim fileDest As String
ProcessDate = Date.Now().ToString("MM.dd.yy")
fileDest = PathToSave & "\" & ProcessDate & " " & Queue & " Suit Data.xlsx"
Dim oXL As New Excel.Application
Dim oBooks As Excel.Workbooks = oXL.Workbooks
Dim oMyBook As Excel.Workbook = oXL.Workbooks.Add
Dim oMySheet As Excel.Worksheet
frmPleaseWait.Label1.Text = "Exporting suit data to Excel. Please wait."
ShowFormCentered(frmLegal, frmPleaseWait)
oMySheet = oXL.ActiveSheet
oMyBook = oXL.ActiveWorkbook
Try
'Begin exporting to Excel
Using CONN As New SqlConnection(ConnStr)
Dim SuitData As New DataTable
Dim dt As DataTable = SuitData
Dim dc As System.Data.DataColumn
Dim colIndex As Integer = 0
Dim rowIndex As Integer = 0
Dim dr As System.Data.DataRow
Dim Qry As String
Qry = "EXEC sp_Custom_IA_POWERHOUSE_PullLegalDocData " & Queue
Dim cmd As New SqlCommand(Qry, CONN)
Dim adp As New SqlDataAdapter(cmd)
adp.Fill(SuitData)
'Set headers from datatable
For Each dc In dt.Columns
colIndex += 1
oMySheet.Cells(1, colIndex) = dc.ColumnName
Next
'Get data rows (dr) from datatable
For Each dr In dt.Rows
rowIndex += 1
colIndex = 0
For Each dc In dt.Columns
colIndex += 1
oMySheet.Cells(rowIndex + 1, colIndex) = dr(dc.ColumnName)
Next
Next
End Using
'Autofit worksheet cells
oMySheet.Columns.AutoFit()
'Append extension to filename if necessary
If Microsoft.VisualBasic.Right(fileDest, 5) <> ".xlsx" Then
fileDest = fileDest & ".xlsx"
End If
'Remove previously existing file if re-running same file on same day
If System.IO.File.Exists(fileDest) Then
System.IO.File.Delete(fileDest)
End If
oMyBook.SaveAs(fileDest)
Catch ex As Exception
MsgBox(ex.Message)
Finally
'Release and close objects
oMyBook.Close()
oXL.Workbooks.Close()
oXL.Quit()
releaseObject(oMySheet)
releaseObject(oMyBook)
releaseObject(oXL)
End Try
Return fileDest
End Function
...然后进入我的垃圾收集例程:
Public Sub releaseObject(ByVal obj As Object)
Try
Dim CheckIt As Integer
CheckIt = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
While CheckIt > 0
CheckIt = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
End While
obj = Nothing
Catch ex As Exception
MsgBox(ex.Message)
Finally
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
我错过了什么?任何想法如何让 EXCEL.EXE *32 内存不足?我不想像之前建议的那样仅仅杀死所有 Excel 进程。不仅回答者表示这不是一个好的解决方案,而且我们公司的人们整天都在使用 Excel,如果我们终止所有 Excel 进程,它可能会干扰最终用户正在进行的其他工作。
欢迎提出建议并提前表示感谢!
编辑:我已经找到并查看了Excel application not quitting after calling quit,但是最后的建议是使用 GC.Collect()。将其添加到我的垃圾收集例程后,我仍然遇到同样的问题。请不要将此问题作为上述链接的副本关闭。谢谢你。
【问题讨论】:
-
你声明了 oBooks 但从未发布它。
-
这个问题已经在 SO....
-
投票结束。无论如何,除了双点之外,另一个问题是 Trya Catch。尝试捕获之外的所有 Realeases 和 GC。当你打电话给潜艇时这样做。看到这个答案:stackoverflow.com/a/41066176/3961708
-
使用工作表、工作簿以相反的顺序释放 excel 对象,退出应用程序然后释放应用程序。使用
Marshal.FinalReleaseComObject它会为您执行ReleaseObject循环。
标签: vb.net excel mailmerge vba