2011-06-14 6 views
0

OleDbConnection을 사용하여 Excel 파일의 데이터를 DataTable로로드하는 일부 코드로 작업하고 있습니다. 현재 첫 번째 시트에 기본값을 IT하지만 점점 다음과 같은 코드를 사용하여 이름의 : Excel 문서는 (우리가 제 3 자로부터받는)라는 이름의 범위를 포함하기 시작했을 때GetOleSchemaTable()을 사용하여 시트 이름을 가져올 수 없습니다.

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myFilename.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES""" 

DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
if (schemaTable.Rows.Count > 0) 
    return schemaTable.Rows[0]["TABLE_NAME"].ToString(); 
else 
    return "Sheet1$" 

이 최근까지 잘 작동하고있다. 나는 내가 찾을 수있는 숨겨진 시트가 없다.

지금

schemaTable.Rows[0]["TABLE_NAME"].ToString() 

첫 번째 범위의 이름을 반환합니다.

내 schemaTable 객체와 다른 점이있어 시트의 이름이 지정된 범위가 아니라 시트를 식별 할 수 있습니까?

+1

? GetOleDbSchemaTable의 전체 내용을 출력 할 때 범위와 시트를 구별 할 수있는 항목이있는 열을 발견합니까? 나는'TABLE_TYPE' 컬럼이 필요한 정보를 담고 있다는 것을 이미지 할 수있다. 반환 된 모든 열의 목록은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbschemaguid.tables.aspx – Heinzi

답변

0

OleDbConnection의 사용이 필수입니까, 아니면 다른 옵션 (예 : DAO)으로 전환 할 수 있습니까?

대체 솔루션 1 : 사용하여 상호 운용성 :

Private Function GetSheetNames(ByVal path As String) 
    Dim lst As New List(Of String) 
    'Note: this will not work for Excel 2007 (.xlsx) workbooks. 
    If IO.File.Exists(path) AndAlso IO.Path.GetExtension(path) = ".xls" Then 
    Dim app As New Excel.Application 
    Dim WB As Excel.Workbook 
    Try 
     WB = app.Workbooks.Open(Filename:=path) 
     If WB IsNot Nothing Then 
     For Each ws As Excel.Worksheet In WB.Sheets 
      lst.Add(ws.Name) 
     Next 
     WB.Close() 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(WB) 
     WB = Nothing 
     End If 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    Finally 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(app) 
     app = Nothing 
    End Try 
    End If 
    Return lst 
End Function 

출처 : http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/21d3f77c-1d3d-44e0-9bd5-eca45a0affa6

대안 솔루션 2 : 사용 DAO : 다른 열을 포함하는 일

Dim dao_dbE As dao.DBEngine 
Dim dao_DB As dao.Database 
dao_dbE = New dao.DBEngine 
Dim sheetsNames As List(Of String) = New List(Of String)() 
dao_DB = dao_dbE.OpenDatabase(completeFileName, False, True, "Excel 8.0;") 
For i As Integer = 0 To dao_DB.TableDefs.Count - 1 
    sheetsNames.Add(dao_DB.TableDefs(i).Name) 
Next 
0

@Heinzi가 반환 된 메타 데이터의 다른 속성을 조사해야만한다고 슬프게도, 그것은 유일한 방법입니다. 대부분의 범위는 일부 속성 값에 따라 시트와 다를 수 있습니다.

업데이트 : 이 솔루션이 작동하지 않기 때문에, 파일이 XSLX 형식 인 경우, 말, 단지 (ZIP XLSX 그냥 기억) myFilename.xlsx/xl/workbook.xml를 사용하여 원시 XML로 드릴 다운 내가 가장 빠르게 생각하고 simpliest 솔루션입니다 , #ZipLib 그리고 <sheets> 노드의 모든 시트 이름을 가져옵니다.

+0

예,하지만 그 중 하나를 시도한 않았다 비 포함 된 열 -null 데이터는 TABLE_NAME, TABLE_TYPE (모든 행에 대해 "TABLE"), DATE_CREATED 및 DATE_MODIFIED (모두 동일 함)입니다. 그래서 나는 이것들로부터 유용한 데이터를 얻을 수 없었습니다. – openshac

+0

해당 솔루션 인 경우 업데이트를 확인하십시오. –

+0

그것은 깔끔한 해결책입니다. – openshac

관련 문제