2009-09-17 11 views
26

Mam użytkowników, którzy nazywają swoje arkusze przeróżne zwariowane rzeczy, ale chcę mieć możliwość uzyskania pierwszego arkusza dokumentu programu Excel, niezależnie od tego, co to jest o imieniu.Uzyskiwanie pierwszego arkusza z dokumentu programu Excel bez względu na nazwę arkusza za pomocą OleDb

Obecnie używać:

OleDbDataAdapter adapter = new OleDbDataAdapter(
"SELECT * FROM [sheetName$]", connString); 

Jak bym go o uzyskanie pierwszego arkusza bez względu na to, co nazywa?

Dziękuję.

+1

możliwe duplikat [Using Excel OleDb uzyskać nazwy arkuszy w arkuszu ORDER] (http://stackoverflow.com/questions/1164698/using-excel-oledb-to -get-name-in-sheet-order) –

Odpowiedz

26

skończyło się tak:

using (OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    conn.Open(); 
    dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME"); 
} 
+1

Po tych wszystkich poszukiwaniach, ten miły fragment był dla mnie rozwiązaniem. – PhilNicholas

1

Można użyć GetOleDbSchemaTable (VB) lub GetOleDbSchemaTable (C#).

Korzystanie z tabel Enum spowoduje wyświetlenie listy wszystkich nazw arkuszy, które następnie można wykorzystać do dynamicznego tworzenia wymaganego kodu SQL.

Można użyć:

MySchemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

Wszystkie nazwy Arkusze zostaną zwrócone w ramach DataTable można je itterate wskroś.

Używanie argumentu OleDbSchemaGuid informacje mogą być pobierane na

  • Kolumny
  • kluczy obcych
  • indeksów
  • kluczy podstawowych
  • Tabele
  • Wyświetleń
Dokumentacja

Pełna MSDN dostępna here

+0

Wygląda na to, że zwraca datatable, jak mogę uzyskać nazwę arkusza? czy to jest nazwane pole? – naspinski

+0

także, jakie parametry należy przekazać dla ograniczeń: Object []? – naspinski

+0

@naspinski - Łączone artykuły zawierają wszystkie wymagane informacje. Nie współpracowałem z OLEDB w ciągu ostatnich 2 lat. Jeśli dobrze pamiętam, nazwa tabeli będzie w polu COLUMN_NAME. – BinaryMisfit

13
OleDbConnection oconn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="Path"; Extended Properties=Excel 12.0;Persist Security Info=False;"); 

oconn.Open(); 
myCommand.Connection = oconn; 
DataTable dbSchema = oconn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
if (dbSchema == null || dbSchema.Rows.Count < 1) 
{ 
    throw new Exception("Error: Could not determine the name of the first worksheet."); 
} 
string firstSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 
+1

Na podstawie moich testów zwraca pierwszy arkusz _alphabetically_, a nie pierwszy arkusz oparty na kolejności, w jakiej pojawiają się w skoroszycie (od lewej do prawej). – Doppelganger

3

Ten kod pracował dobrze gdzie Użyłem siatki danych „DataGridView1” załadować całą zawartość Arkusz

Dim MyConnection As System.Data.OleDb.OleDbConnection 
Dim DtSet As System.Data.DataSet : Dim filteext As String = "" 

''check for the file type 
If IO.Path.GetExtension(fileName) = "xls" Then 
       filteext = "Excel 8.0" 
ElseIf IO.Path.GetExtension(fileName) = ".xlsx" Then 
       filteext = "Excel 12.0" 
End If 

''open connection 

MyConnection = New System.Data.OleDb.OleDbConnection _ 
       ("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & fileName & "';Extended Properties=" & filteext & ";") 
      MyConnection.Open() 

    Dim myTableName = MyConnection.GetSchema("Tables").Rows(0)("TABLE_NAME") 

    Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(String.Format("SELECT * FROM [{0}]", myTableName), MyConnection) 


    MyCommand.TableMappings.Add("Table", "TestTable") 
      DtSet = New System.Data.DataSet 

    MyCommand.Fill(DtSet) 

    DataGridView1.DataSource = DtSet.Tables(0) 
      'DtSet.DataSetName. 

    MyConnection.Close() 
1

Zasadniczo kopia Anirudh Gau r odpowiedź. Zrobiłem formatowanie kodu i wstawiłem go do funkcji. Dodałem StringBuilder, dzięki czemu mogę zrobić więcej za pomocą instrukcji SELECT.

Upvotes iść do Anirudh Gaur

Private Function Load_XLS(FileName As String) As DataTable 
    Dim DataTable As New DataTable 
    Dim Format As String = "" 
    If IO.Path.GetExtension(FileName) = ".xls" Then 
     Format = "Excel 8.0" 
    ElseIf IO.Path.GetExtension(FileName) = ".xlsx" Then 
     Format = "Excel 12.0" 
    End If 

    Using Connection As New OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & FileName & "';Extended Properties=" & Format & ";") 
     Connection.Open() 

     Dim TableName As String = Connection.GetSchema("Tables").Rows(0)("TABLE_NAME") 

     Dim SQLCommand As New Text.StringBuilder 
     SQLCommand.AppendLine("SELECT *") 
     SQLCommand.AppendLine("FROM [{0}]") 

     Dim Command As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(String.Format(SQLCommand.ToString, TableName), Connection) 

     Command.Fill(DataTable) 

     Connection.Close() 
    End Using 
    Return DataTable 
End Function 
Powiązane problemy