VB.NETとExcelをデータソースとして、Word文書をメイン文書として差し込み印刷を実行しようとしています。VB.NETの差し込み印刷後にExcelにメモリが残る
何を試しても、EXCEL.EXE * 32はタスクマネージャで実行したままです。私は同じプログラムで後続のマージのためのデータソースとして同じExcelファイルを再利用できるように、終了する必要があります。
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
SourceFile = CreateSourceFile(Queue, F.SelectedPath)
これは私の関数CreateSourceFileにつながる:ここ
は、コードが呼び出される方法です
私は何を欠席しましたか?どのようにメモリからEXCEL.EXE * 32を取得するための任意のアイデア?これまでに提案されているように、すべてのExcelプロセスを強制終了したくはありません。回答者はこれが良い解決策ではないと指摘するだけでなく、私たちは一日中Excelを弊社で使用し、すべてのExcelプロセスを抹消すれば、エンドユーザーが行っている他の作業に干渉する可能性があります。
アドバイスをいただき、事前に感謝の意を表します。
編集:私は既に見つけてExcel application not quitting after calling quitを見直しましたが、最後にGC.Collect()を使用することを提案しました。それを私のガベージコレクションルーチンに追加した後も、私はまだ同じ問題があります。上記のリンクの複製としてこの質問を閉じないでください。ありがとうございました。
あなたはoBooksを宣言しますが、それを解放することはありません。 – Sorceri
この質問は何度もSOに....私はこれを閉じるに投票しています。 – Codexer
投票に参加しました。とにかく、ダブルドット以外の別の問題は、Trya Catchです。すべてのRealeasesとGCは試してみてください。あなたがサブを呼んでいるときにそれをします。この回答を参照してください:http://stackoverflow.com/a/41066176/3961708 – cyboashu