以下は、あなたが順序位置を経由してシート名を収集することができ、Excelの自動化とは異なり、シートをフェッチするとき、残念ながら-ZをソートOLEDB経由して、特定のExcelファイルからシート名を収集します。
次のように、わかっていますが、とにかく言えば、シートの最初の行は列名またはデータとなり、接続文字列が正しいものに設定する必要がありますコードで示されていますが、これを決定する真の方法はありません。通常は「あなたが知っている」または「顧客が決める」です。
まずアップ、(this code sampleから取得されます)クラス
Imports System.Data.OleDb
Public Class Connections
Public Sub New()
End Sub
''' <summary>
''' Create a connection where first row contains column names
''' </summary>
''' <param name="FileName"></param>
''' <param name="IMEX"></param>
''' <returns></returns>
''' <remarks></remarks>
<System.Diagnostics.DebuggerStepThrough()> _
Public Function HeaderConnectionString(ByVal FileName As String, Optional ByVal IMEX As Integer = 1) As String
Dim Builder As New OleDbConnectionStringBuilder
If IO.Path.GetExtension(FileName).ToUpper = ".XLS" Then
Builder.Provider = "Microsoft.Jet.OLEDB.4.0"
Builder.Add("Extended Properties", String.Format("Excel 8.0;IMEX={0};HDR=Yes;", IMEX))
Else
Builder.Provider = "Microsoft.ACE.OLEDB.12.0"
Builder.Add("Extended Properties", String.Format("Excel 12.0;IMEX={0};HDR=Yes;", IMEX))
End If
Builder.DataSource = FileName
Return Builder.ToString
End Function
''' <summary>
''' Create a connection where first row contains data
''' </summary>
''' <param name="FileName"></param>
''' <param name="IMEX"></param>
''' <returns></returns>
''' <remarks></remarks>
<System.Diagnostics.DebuggerStepThrough()> _
Public Function NoHeaderConnectionString(ByVal FileName As String, Optional ByVal IMEX As Integer = 1) As String
Dim Builder As New OleDbConnectionStringBuilder
If IO.Path.GetExtension(FileName).ToUpper = ".XLS" Then
Builder.Provider = "Microsoft.Jet.OLEDB.4.0"
Builder.Add("Extended Properties", String.Format("Excel 8.0;IMEX={0};HDR=No;", IMEX))
Else
Builder.Provider = "Microsoft.ACE.OLEDB.12.0"
Builder.Add("Extended Properties", String.Format("Excel 12.0;IMEX={0};HDR=No;", IMEX))
End If
Builder.DataSource = FileName
Return Builder.ToString
End Function
End Class
はあなたが注意します
Imports System.Data.OleDb
Public Class Utility
Public Sub New()
End Sub
''' <summary>
''' Returns a list of sheet names from Excel or table names from Access
''' </summary>
''' <param name="ConnectionString"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function SheetNames(ByVal ConnectionString As String) As List(Of SheetNameData)
Dim Names As New List(Of SheetNameData)
Using cn As New OleDbConnection(ConnectionString)
cn.Open()
Dim dt As DataTable = New DataTable With {.TableName = "AvailableSheetsTables"}
dt = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
cn.Close()
Names =
(
From F In dt.Rows.Cast(Of DataRow)()
Select New SheetNameData With
{
.DisplayName = F.Field(Of String)("TABLE_NAME").Replace("$", ""),
.ActualName = F.Field(Of String)("TABLE_NAME")
}
).ToList
End Using
Return Names
End Function
End Class
Public Class SheetNameData
Public Sub New()
End Sub
Public Property DisplayName As String
Public Property ActualName As String
End Class
最初のものは、ファイル名とパスであるもう一つの支持クラスは、ハードコーディングされているのサポート、ノーチェックこの完全な応答がサンプルであるかどうかを確認するには、手元のタスクを継続します。ボタンのクリックイベントでは、シート名を取得しますが、もちろんこれは別のイベントで行うことができます。フォームの負荷。シート名は強いタイプのリストに置かれ、最初のシートが選択されます(シートがあるかどうかわからない場合はアサーションが使用されます)。最初の行のシートをデータとして開きます。もしあなたのカラムヘッダーがあれば、このための接続方法も含めています。 DataTableは使用された行と列でロードされ、DataTableはDataGridViewのDataSourceになります。
Public Class Form1
Private FileName As String = IO.Path.Combine(
AppDomain.CurrentDomain.BaseDirectory, "PeopleData.xlsx")
Private Connection As Connections = New Connections
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Utils = New Utility
Dim SheetsList As List(Of SheetNameData) = Utils.SheetNames(
Connection.NoHeaderConnectionString(IO.Path.GetFileName(FileName)))
Dim dt As New DataTable
Dim ConnectionString As String = Connection.NoHeaderConnectionString(FileName)
Using cn As New OleDb.OleDbConnection With {.ConnectionString = ConnectionString}
Using cmd As New OleDb.OleDbCommand(
String.Format("SELECT * FROM [{0}]",
SheetsList.FirstOrDefault.ActualName),
cn)
cn.Open()
dt.Load(cmd.ExecuteReader)
End Using
End Using
DataGridView1.DataSource = dt
End Sub
End Class
あなたが特定のシートではなく、ランダムシートをしたい場合は、各シートを開く必要があり、例えば予想データをチェックします、ノートの終了最初の行にフィールド/列名がある場合は、最初の行を読み取り、ヘッダなしの接続文字列でこれを有効にしてから、正しいシートが見つかると、ヘッダーが設定された接続文字列を使用してロードします。
これは役に立ちます:-)
あなたの 'filePath'はこのように連結されるべきではありません。 'savedPath'に後ろにバックスラッシュがあるかどうかを気にする必要がないように、' System.IO.Path.Combine'を使います。 –
「動的に」という意味を説明できますか? OLEDBアダプタは、シートの名前をdbテーブル名として使用するので、必要なシートの名前を*指定する必要があります。または、ブック内の最初のシートの名前をプログラムで調べて、それをクエリ文字列に連結する方法を尋ねていますか? –
@ Mat'sMugこれはどうして関係ないですか?私はすでにファイルパスを設定する変数を持っています。私の質問は、シート名を指定せずにシートを表示する方法です。 – JT4U