前回は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行ずつデータ行を取得しデータ処理を行います。
以下のソースはテストですので単にデータを文字列として連結して表示しています。
関数の終了処理では使用したオブジェクトの解放を行います。
尚、今回の処理で以下のエラーが出た場合はMicrosoftの再頒布可能コンポーネントをインストールして下さい。
「'Microsoft.Ace.OLEDB.12.0' プロバイダはローカルのコンピュータに登録されていません。」
■Microsoftのリンク先 Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
=====
2016/01/27:の時の情報
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
コメント