2009-09-17 16 views
26

Tengo usuarios que nombran sus hojas como todo tipo de cosas locas, pero quiero poder obtener la primera hoja del documento de Excel independientemente de lo que sea llamado.Obteniendo la primera hoja de un documento de Excel sin importar el nombre de la hoja con OleDb

Actualmente uso:

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

¿Cómo hago para conseguir la primera hoja no importa lo que se llama?

Gracias.

+1

posible duplicado de [Uso de Excel OleDb para obtener los nombres de hoja en hoja orden] (http://stackoverflow.com/questions/1164698/using-excel-oledb-to -get-sheet-names-in-sheet-order) –

Respuesta

26

terminó usando la siguiente:

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

Después de toda mi búsqueda, este buen fragmento fue lo que me solucionó. – PhilNicholas

1

Puede usar GetOleDbSchemaTable (VB) o GetOleDbSchemaTable (C#).

Usando las tablas Enum devolverá una lista de todos los nombres de la hoja de trabajo, que luego puede usar para construir dinámicamente el SQL requerido.

Se puede utilizar:

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

Todos los nombres de las hojas de trabajo serán devueltos como parte de un DataTable se les puede itterate través.

Utilizando la información OleDbSchemaGuid se pueden recuperar en

  • Columnas
  • Las claves externas
  • índices
  • Las claves primarias
  • Tablas
  • Vistas
documentación

completa de MSDN disponibles here

+0

parece que devuelve una tabla de datos, ¿cómo obtengo el nombre de la hoja? es un campo nombrado? – naspinski

+0

también, ¿qué parámetros paso por las restricciones: Objeto []? – naspinski

+0

@naspinski - Los artículos que he vinculado contienen toda la información requerida. No he trabajado con OLEDB en los últimos 2 años. Si recuerdo correctamente, el nombre de la tabla estará en el campo 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

Según mis pruebas, esto devuelve la primera hoja _ alfabéticamente_, no la primera hoja según el orden en que aparecen en el libro (de izquierda a derecha). – Doppelganger

3

Este código ha funcionado bien donde he utilizado la cuadrícula de datos "DataGridView1" para cargar todo el contenido de la hoja

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

Básicamente una copia de Anirudh Gau la respuesta de r. Hice un cambio de formato del código y lo puse en una función. Agregué un StringBuilder para poder hacer más con la instrucción SELECT.

upvotes ir a 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 
Cuestiones relacionadas