VB .NETからエクセル出力
VB.NETからエクセルに出力するときの備忘録です。
参照設定にて「Microsoft Excel 14.0 Object Library」を追加
'どのファイルに記入するか指定して、Functionを呼び出し
Private Sub btnExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExec.Click
Dim Ret as Boolean=False
Ret=ExcelOutput("C:\TEST\テンプレート.xls")
End Sub
Imports Microsoft.Office.Interopを追加
Private Function ExcelOutput(ByVal LoadFilePath As String) As Boolean
Dim xlApp As New Excel.Application
'================== 起動時の処理 ===================
xlApp.Visible = False 'Excelを表示(必ずとも表示しなくてもよい)
xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = xlBooks.Open(LoadFilePath)
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet
Dim xlRange As Excel.Range
Dim localByName As Process() = Process.GetProcessesByName("Excel")
xlSheet = xlBook.Worksheets(1)
xlRange = xlSheet.Range("A1")
xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定
xlRange = xlSheet.Range("P3") '記入したい場所
xlRange.Value = "ここに記入したい文字を書く"
MRComObject(xlRange)
'ファイルの名前をつけて保存保存
SaveFilePath = "C:\TEST\" '保存先
xlBook.SaveAs(SaveFilePath)
xlApp.DisplayAlerts = True '保存時の問合せのダイアログを表示に設定
'================== 終了処理 =====================
MRComObject(xlRange) 'xlRange の解放
MRComObject(xlSheet) 'xlSheet の解放
MRComObject(xlSheets) 'xlSheets の解放
xlBook.Close(False) 'xlBook を閉じる
MRComObject(xlBook) 'xlBook の解放
MRComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
MRComObject(xlApp) 'xlApp を解放
If localByName.Length > 1 Then
GC.Collect() 'ガベージコレクターにてEXCELを回収
End If
'-------------------------------------------------------------------------
GC.Collect() '終了後すぐ再起動したい場合は、強制的にガベージ コレクションを実行して下さい。
System.Threading.Thread.Sleep(1000) '回収待ち時間
'--------------------------------------------------------------------------
End Function
MRComObjectは下記をコピーしておく
#Region "メモリ解放"
Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
Dim IDEEnvironment As Boolean = False 'メッセージボックスを表示させたい場合は、True に設定
If objCom Is Nothing Then
If IDEEnvironment = True Then
'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
MessageBox.Show("Nothing です。")
End If
Return
End If
Try
If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
Dim count As Integer
If force Then
count = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
Else
count = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
End If
If IDEEnvironment = True AndAlso count <> 0 Then
Try
'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
MessageBox.Show(TypeName(objCom) & " 要調査! デクリメントされていません。")
Catch ex As Exception
MessageBox.Show(" 要調査! デクリメントされていません。")
End Try
End If
Else
If IDEEnvironment = True Then
'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
MessageBox.Show("ComObject ではありませんので、解放処理の必要はありません。")
End If
End If
Finally
objCom = Nothing
End Try
End Sub
#End Region