【问题标题】:Excel stays in memory after VB.NET mail merge [duplicate]VB.NET邮件合并后Excel保留在内存中[重复]
【发布时间】: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


【解决方案1】:

Sorceri 在上面的 cmets 中找到了解决方案:oBooks 已声明并设置但从未发布。

谢谢巫师!!

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2013-05-08
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多