NonSoft

参照設定しないでエクセルを使用するサンプル(VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
参照設定しないでVB.NETからエクセルを使用して帳票を印刷するサンプルを作ってみました。
帳票印刷機能を簡単に実現したい時に如何でしょうか。

このサンプルのキーワードは以下の通りです。
(1)参照の追加(Microsoft Excel *.* Object Library)
(2)Excel.Application
(3)Excel.Workbooks
(4)Excel.Workbook
(5)Excel.Worksheet.PrintOut
(6)Marshal.ReleaseComObject
(7)System.GC.Collect

参照設定しないメリットは、実行するまでEXCELのバージョンを特定しない事です。
つまり、開発環境のEXCELに影響されないプログラムを作る事が出来ます。たぶん、
遅延バインディングと言う技だと思います。

参照設定してエクセルを使用するサンプルはこちらです。
エクセルを使用した帳票印刷のサンプル(VB.NET)

C#.NETのサンプルはこちらです。
EXCEL印刷(Worksheet.PrintOut)のサンプル(C#.NET)

VB6のサンプルはこちらです。
エクセルへデータをコピーし表示するサンプル(VB6)
エクセルを起動しいろいろ操作するサンプル(VB6)

★エクセルによる印刷クラス(ExcelPrint.vb)
Option Strict Off

Imports System.Runtime.InteropServices

''' -----------------------------------------------------------------------------
''' エクセルによる帳票印刷クラス
''' -----------------------------------------------------------------------------
Public Class ExcelPrint

    Public _xslFile As String = "c:\temp\Book1.xls"     ' XLSファイル名
    Public _sheetNo As Integer = 1                      ' シートNo.
    Public _col As String = "A"                         ' データ書き込みカラム
    Public _line As String = "1"                        ' データ書き込み開始行
    Public _printer As String = ""                      ' 出力プリンター

    Public _A1 As String = ""                           ' A1
    Public _A2 As String = ""                           ' A2
    Public _A3 As String = ""                           ' A3
    Public _A4 As String = ""                           ' A4
    Public _A5 As String = ""                           ' A5

    ''' -----------------------------------------------------------------------------
    ''' 印刷実行
    ''' -----------------------------------------------------------------------------
    Public Sub Print()
        ' Excel.Application(Microsoft Excel *.* Object Library)の参照設定を
        ' 行なわずエクセルを操作するサンプル
        Dim objExcel As Object = Nothing     'Excel.Application
        Dim objWorkBooks As Object = Nothing 'Excel.WorkBooks
        Dim objWorkBook As Object = Nothing  'Excel.Workbook

        Try
            'EXCEL開始処理
            Try
                objExcel = CreateObject("Excel.Application") 'New Excel.Application
            Catch ex As Exception
                Throw New Exception( _
                    "Microsoft Office Excelがインストールされていないため" & vbCrLf & _
                    "印刷できません。")
            End Try

            If Dir(_xslFile) = "" Then
                Throw New Exception( _
                    "エクセルファイルが見つかりませんでした。" & vbCrLf & _xslFile)
            End If

            Const xlMaximized = -4137
            Const xlMinimized = -4140
            Const xlNormal = -4143
            objExcel.WindowState = xlMinimized ' Excel.XlWindowState.xlMinimized
            objExcel.Visible = False
            objExcel.DisplayAlerts = False

            ' CType(objExcel.Workbooks, Excel.Workbooks)
            objWorkBooks = objExcel.Workbooks
            ' CType(objWorkBooks.Open(_xslFile), Excel.Workbook)
            objWorkBook = objWorkBooks.Open(_xslFile)

            'EXCEL出力処理
            With objWorkBook.Sheets(_sheetNo)
                .Range(_col & _line + 0) = _A1
                .Range(_col & _line + 1) = _A2
                .Range(_col & _line + 2) = _A3
                .Range(_col & _line + 3) = _A4
                .Range(_col & _line + 4) = _A5

                '印刷実行
                If _printer <> "" Then
                    .PrintOut(Copies:=1, ActivePrinter:=_printer, Collate:=True)
                Else
                    .PrintOut(Copies:=1, Collate:=True)
                End If
            End With

            objWorkBook.Saved = True                        '保存済みとする

        Catch ex As Exception
            Throw ex
        Finally
            ' EXCEL終了処理
            If Not IsNothing(objWorkBook) Then
                objWorkBook.Close(False)                    'ファイルを閉じる
                Marshal.ReleaseComObject(objWorkBook)       'オブジェクト参照を解放
                objWorkBook = Nothing                       'オブジェクト解放
            End If

            If Not IsNothing(objWorkBooks) Then
                Marshal.ReleaseComObject(objWorkBooks)      'オブジェクト参照を解放
                objWorkBooks = Nothing                      'オブジェクト解放
            End If

            If Not IsNothing(objExcel) Then
                objExcel.Quit()                             'EXCELを閉じる
                Marshal.ReleaseComObject(objExcel)          'オブジェクト参照を解放
                objExcel = Nothing                          'オブジェクト解放
            End If
            System.GC.Collect()                             'オブジェクトを確実に削除
        End Try
    End Sub

End Class

★メインのフォーム(テスト用)(Form1.vb)
''' -----------------------------------------------------------------------------
''' メインのフォーム(テスト用)
''' -----------------------------------------------------------------------------
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。

    End Sub

    ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    ' Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使って変更してください。  
    ' コード エディタを使って変更しないでください。
    Friend WithEvents Button1 As System.Windows.Forms.Button
     Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(24, 16)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(280, 56)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "印 刷"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
        Me.ClientSize = New System.Drawing.Size(328, 94)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "エクセルを使用した帳票印刷のサンプル"
        Me.ResumeLayout(False)

    End Sub

#End Region

    ''' -----------------------------------------------------------------------------
    ''' 印刷ボタンクリック
    ''' -----------------------------------------------------------------------------
    Private Sub Button1_Click( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Dim objExcel As New ExcelPrint
        objExcel._A1 = "A1"
        objExcel._A2 = "A2"
        objExcel._A3 = "A3"
        objExcel._A4 = "A4"
        objExcel._A5 = "A5"
        objExcel.Print()
        objExcel = Nothing
    End Sub
End Class