ADO.NETを使ってExcelのシート名を高速に取得する及びExcelのバージョンを取得 (SNo.066) | |
使用コントロール | Button1 ListBox1 |
その他条件 | WindowsVista VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86 Excel 2007/Excel
2010 [Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 参照する Excel ファイルは、各自準備して下さい。 |
★ ADO.NETを使ってExcelのシート名を高速に取得する
Public Class Form1 #Region "本文関係の処理" Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click '一旦表示を消去 ListBox1.Items.Clear() ListBox1.Refresh() 'ADO.NET の機能を使ってシート名を取得 'ADO でシート名を取得した場合は、Excelで表示している順番ではなくソート順になる。 Dim xlsFileName As String = System.IO.Path.GetFullPath("..\..\..\data\test.xls") Dim con As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsFileName & _ ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""") If excelVersion >= 12 Then xlsFileName = System.IO.Path.GetFullPath("..\..\..\data\test.xlsx") con = New System.Data.OleDb.OleDbConnection( _ "provider=Microsoft.ACE.OLEDB.12.0;Data source=" & xlsFileName & _ ";Extended properties=""Excel 12.0;HDR=YES;IMEX=1""") End If con.Open() Dim sgt As DataTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, _ New Object() {Nothing, Nothing, Nothing, "TABLE"}) For i As Integer = 0 To sgt.Rows.Count - 1 Dim sheetName As String = sgt.Rows(i)!TABLE_NAME.ToString If sheetName.EndsWith("$") Or sheetName.EndsWith("'") Then ListBox1.Items.Add(sheetName) End If Next i con.Close() End Sub #End Region #Region "Excel.exeのバージョンを取得" <System.Runtime.InteropServices.DllImport("shell32.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function FindExecutable( _ ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As System.Text.StringBuilder) As Integer End Function Private Shared Function GetExcelVersion(ByVal xlsPath As String) As String 'パスを受け取る為のバッファーを用意 Dim appPath As New System.Text.StringBuilder(255) '関数を実行してファイルパスを取得 If FindExecutable(xlsPath, Nothing, appPath) > 32 Then GetExcelVersion = appPath.ToString() Dim fvi As FileVersionInfo = FileVersionInfo.GetVersionInfo(appPath.ToString()) GetExcelVersion = fvi.FileVersion.ToString() If GetExcelVersion.IndexOf(".") > 1 Then GetExcelVersion = GetExcelVersion.Substring(0, GetExcelVersion.IndexOf(".")) Else GetExcelVersion = "0" End If Else GetExcelVersion = "0" End If End Function Private excelVersion As Integer Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load excelVersion = CInt(GetExcelVersion("..\..\..\data\Test.xls")) End Sub #End Region End Class |
|
起動中の Excel のバージョンを取得するのは簡単ですが、使用する Excel.exe のバージョンとなるとこのような方法になるかと思います。 又、Com オブジェクトを使用していないので、解放処理等は必要ありませんし、Excel が無くても使用できます。 但し、使用する Excel のファイルの拡張子に合わせて使い分けて下さい。 |