2016-12-20 5 views
0

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()を使用することを提案しました。それを私のガベージコレクションルーチンに追加した後も、私はまだ同じ問題があります。上記のリンクの複製としてこの質問を閉じないでください。ありがとうございました。

+1

あなたはoBooksを宣言しますが、それを解放することはありません。 – Sorceri

+0

この質問は何度もSOに....私はこれを閉じるに投票しています。 – Codexer

+0

投票に参加しました。とにかく、ダブルドット以外の別の問題は、Trya Catchです。すべてのRealeasesとGCは試してみてください。あなたがサブを呼んでいるときにそれをします。この回答を参照してください:http://stackoverflow.com/a/41066176/3961708 – cyboashu

答えて

0

ソルセリは、上記のコメントに解決策を見つけました。oBooksは宣言され、設定されましたが、決してリリースされませんでした。

Thanks Sorceri !!

関連する問題