忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:OleDBを使ったエクセルファイルへのアクセス
前回はCOMオブジェクトを使ってエクセルファイルのアクセスを行いましたが、今回はOleDBを使います。
COMオブジェクトだとプロセスがメモリに残ることを気にしないといけませんが、OleDBでは気にしなくても良いようです。

以下のソースでは引数としてエクセルファイルのファイル名を指定しています。
関数の先頭で、関数内で使用するOleDB接続クラス、OleDBデータアダプタクラス、データテーブルクラスの宣言を行っています。 最初にOleDB接続クラスを使ってエクセルとの接続を行います。 ファイルの拡張子が「xlsx」と「xls」では接続されるOleDBが異なります。 「xls」では「Microsoft.Jet.OLEDB.4.0」だったのですが、「xlsx」では「Microsoft.Ace.OLEDB.12.0」になります。

次に、OleDBデータアダプタクラスを使ってエクセルシートのデータにアクセスします。 エクセルのシートをデータベースのテーブルの様に扱えます。 SQL文の中のFROM句で「Sheet1$」と記述している部分がそうです。 抽出範囲を指定する場合にはソースの様に「Sheet1$A1:C10」とすれば、 A,B,Cカラムの1行目から10行目までの指定になります。

データアダプタを作成後、データアダプタのメソッド「Fill」でデータテーブル、 エクセルのシートからデータを全て取り込みます。 後は、データテーブルから1行ずつデータ行を取得しデータ処理を行います。
以下のソースはテストですので単にデータを文字列として連結して表示しています。

関数の終了処理では使用したオブジェクトの解放を行います。
''' <summary>エクセルファイル処理</summary>
''' <param name="strXlsxFileName">xlsxファイル名</param>
Private Sub TestXlsx2(ByVal strXlsxFileName As String)
    'OleDB接続クラス
    Dim oleCon As System.Data.OleDb.OleDbConnection = Nothing
    'OleDBデータアダプタクラス
    Dim oleAdp As System.Data.OleDb.OleDbDataAdapter = Nothing
    'データテーブルクラス
    Dim adoTbl As System.Data.DataTable = Nothing

    Try
        'EXCELとの接続
        Try
            oleCon = New System.Data.OleDb.OleDbConnection()
            If System.IO.Path.GetExtension(strXlsxFileName).ToLower = "xlsx" Then
                oleCon.ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & _
                    System.IO.Path.GetFullPath(strXlsxFileName) & ";Extended Properties=Excel 12.0;"
            Else
                oleCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                    System.IO.Path.GetFullPath(strXlsxFileName) & ";Extended Properties=Excel 8.0;"
            End If
            oleCon.Open()
        Catch ex As Exception
            MsgBox("...EXCELオープン失敗")
            Exit Sub
        End Try

        'EXCELデータを全て取得(仮にA,B,Cカラムの10行分)
        Dim strSQL As String = "SELECT * FROM [Sheet1$A1:C10]"
        Try
            oleAdp = New System.Data.OleDb.OleDbDataAdapter(strSQL, oleCon)
            adoTbl = New System.Data.DataTable
            oleAdp.Fill(adoTbl)
        Catch ex As Exception
            MsgBox("...EXCELデータ取得失敗")
            Exit Sub
        End Try

        '文字列の連結
        Dim strTest As String = ""

        Dim adoRow As System.Data.DataRow
        For Each adoRow In adoTbl.Rows
            strTest &= adoRow(0).ToString.Trim
            strTest &= adoRow(1).ToString.Trim
            strTest &= adoRow(2).ToString.Trim
        Next
        MsgBox(strTest)

    Finally
        If Not adoTbl Is Nothing Then
            adoTbl.Clear()
            adoTbl.Dispose()
        End If
        adoTbl = Nothing

        If Not oleAdp Is Nothing Then
            oleAdp.Dispose()
        End If
        oleAdp = Nothing

        If Not oleCon Is Nothing Then
            oleCon.Close()
            oleCon.Dispose()
        End If
        oleCon = Nothing
    End Try
End Sub


尚、今回の処理で以下のエラーが出た場合はMicrosoftの再頒布可能コンポーネントをインストールして下さい。

「'Microsoft.Ace.OLEDB.12.0' プロバイダはローカルのコンピュータに登録されていません。」

■Microsoftのリンク先 Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント


=====
2016/01/27:の時の情報











PR

コメント

コメントを書く