2016-08-30 8 views
0

ユーザーがスプレッドシートをアップロードし、ヘッダー行のシート名と行番号を指定するアプリがあります。私は、指定された行から列名を抽出するために、アプリケーションが必要です。私は一番上の行を返すように働くことができました。どのように私は、ExcelファイルからSystem.Data.OleDbでテーブルを選択する方法はありません、私は行にする必要がありますしたい列名(x)は私の知る限りではADOとVB.netを使用してExcelの特定の行から列ヘッダーを取得

 Dim ExcelConn As System.Data.OleDb.OleDbConnection 
     Dim ExcelTable As DataTable = Nothing 
     Dim dr As DataRow 
     Dim sheet_found As Boolean = False 
     ExcelConn = New system.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & file & ";Extended Properties=Excel 12.0;") 
     End If 

     'open the file 
     ExcelConn.Open() 
     ExcelTable = ExcelConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "Table"}) 

     'make sure there is a matching sheet name 
     For Each dr In ExcelTable.Rows 
      If dr("TABLE_NAME").ToString() = sheet & "$" Then 
       sheet_found = True 
       Exit For 
      End If 
     Next 
     If sheet_found = False Then 
      MesgBox("the sheet name specified in the header (" + sheet + ") was not found") 
      ExcelConn.Close() 
      Exit Sub 
     Else 
      Dim sheet_name As String = Nothing 
      sheet_name = "[" & sheet & "$]" 
      Dim cmd1 As New System.Data.OleDb.OleDbCommand("Select * From " & sheet_name, ExcelConn) 
      Dim da As New OleDbDataAdapter("Select * From " & sheet_name, ExcelConn) 
      Dim ds As DataSet = New DataSet() 
      Dim dc As DataColumn 
      da.Fill(ds) 
      For Each dc In ds.Tables(0).Columns 'this returns col names fine from first row. how would i tell it to get names from 2nd or 3rd row, etc. The integer var is passed in. i just need to know how to specify that it is row(x) 
       header_row = LCase(RTrim(header_row + "|" + dc.ColumnName)) 
      Next 
      MsgBox(header_row) 
      ExcelConn.Close() 
     End If 

答えて

0

は(過去にその問題をチェックする)ことspeficyうヘッダーが行1に配置されていない場合は、SQL照会を使用してください。。私の解決策は、ワークシートを照会する前にヘッダー行の上にあるすべての行を削除することです。つまり、Microsoft.Office.Interopというワークブックを開き、余分な行を削除し、閉じて、照会するだけです。

Excelは非常に強力なツールですが、データベース(SQL Serverやアクセスファイルなど)として動作するようには設計されていませんでした。

0

jonathanaが指摘しているように、JET/ACEドライバを使用してExcelシートのデータにアクセスするための既知の制限がいくつかあります。

代わりに、私はExcel ADO.NETプロバイダを提供したいと思います。これにより、JET/ACEドライバに慣れているExcelデータへのすべてのSQLアクセスが可能になりますが、データがExcelでどのように整理されるかに柔軟性があります。

あなたの例では、あなたはヘッダは4行目に配置されていることを示すために、次のようなクエリ提出することができます:

たちのプロバイダを使用して
SELECT * FROM Sheet1#A4:** 

、あなたのコードは、次のようになります。

は、
Dim ExcelConn As System.Data.CData.Excel.ExcelConnection 
Dim ExcelTable As DataTable = Nothing 
Dim dr As DataRow 
Dim sheet_found As Boolean = False 
ExcelConn = New System.Data.CData.Excel.ExcelConnection("Excel File=" & file & ";") 

'open the file 
ExcelConn.Open() 
ExcelTable = ExcelConn.GetSchema("Tables") 

'make sure there is a matching sheet name 
For Each dr In ExcelTable.Rows 
    If dr("Table_Name").ToString() = sheet Then 
    sheet_found = True 
    Exit For 
    End If 
Next 
If sheet_found = False Then 
    MesgBox("the sheet name specified in the header (" + sheet + ") was not found") 
    ExcelConn.Close() 
    Exit Sub 
Else 
    Dim sheet_name As String = Nothing 
    'Here, I assume that header_row indicates the row that contains the headers 
    sheet_name = "[" & sheet & "#A" & header_row & ":**]" 
    Dim cmd1 As New System.Data.CData.Excel.ExcelCommand("Select * From " & sheet_name, ExcelConn) 
    Dim da As New System.Data.CData.Excel.ExcelDataAdapter("Select * From " & sheet_name, ExcelConn) 
    Dim ds As DataSet = New DataSet() 
    Dim dc As DataColumn 
    da.Fill(ds) 
    For Each dc In ds.Tables(0).Columns 
    'I wasn't sure what this code was meant to accomplish, but at this point, 
    'dc.ColumnName contains the column names from header_row 
    Next 
    ExcelConn.Close() 
End If 

私たちのサイトにはblog postがあり、プロバイダに関する詳しい情報があります。download a free trialもご覧ください。

関連する問題