2016-04-08 8 views
1
Dim MyConnection As System.Data.OleDb.OleDbConnection 
     Dim DtSet As System.Data.DataSet 
     Dim MyCommand As System.Data.OleDb.OleDbDataAdapter 
     Dim filePath = GlobalVariable.savedPath + GlobalVariable.excelFileName 

     'Code to Use an Oledb Connection to get data from the Excel File 
     MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";Extended Properties='Excel 12.0 Xml;HDR=YES;';") 
     'Code to Read the Sheet Selected from the Excel Spread Sheet' 
     MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection) 
     '-- Extra Code Not Needed which Maps the tables as Columns from the Spreadsheet 
     'MyCommand.TableMappings.Add("Table", "Net-informations.com") 
     DtSet = New System.Data.DataSet 
     MyCommand.Fill(DtSet) 
     'Populates GridView with the excel Spreadsheet 
     GridView1.DataSource = DtSet.Tables(0) 
     'Code Below needed to show the excel to GridView 
     GridView1.DataBind() 
     MyConnection.Close() 

このコードは基本的に、グリッド表示でselect * from Sheet1$を使用してExcelファイルを示しています。しかし、私は、データソースにあるどのファイルでも、Excelシートを動的に表示したいと考えています。シートの名前を指定せずにExcelワークシートを動的に読み取る方法

+0

あなたの 'filePath'はこのように連結されるべきではありません。 'savedPath'に後ろにバックスラッシュがあるかどうかを気にする必要がないように、' System.IO.Path.Combine'を使います。 –

+0

「動的に」という意味を説明できますか? OLEDBアダプタは、シートの名前をdbテーブル名として使用するので、必要なシートの名前を*指定する必要があります。または、ブック内の最初のシートの名前をプログラムで調べて、それをクエリ文字列に連結する方法を尋ねていますか? –

+0

@ Mat'sMugこれはどうして関係ないですか?私はすでにファイルパスを設定する変数を持っています。私の質問は、シート名を指定せずにシートを表示する方法です。 – JT4U

答えて

1

以下は、あなたが順序位置を経由してシート名を収集することができ、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 

あなたが特定のシートではなく、ランダムシートをしたい場合は、各シートを開く必要があり、例えば予想データをチェックします、ノートの終了最初の行にフィールド/列名がある場合は、最初の行を読み取り、ヘッダなしの接続文字列でこれを有効にしてから、正しいシートが見つかると、ヘッダーが設定された接続文字列を使用してロードします。

これは役に立ちます:-)

+0

私は上記のコードからそれを行うことはできませんか? – JT4U

+0

私の知る限り、いいえ、そうでないとガイダンスやコードサンプルが提供されていました。 –

関連する問題