2011-06-14 46 views
0

我正在使用一些使用OleDbConnection将数据从Excel文件加载到DataTable的代码。目前,它默认为第一页,但得到它使用下面的代码的名字:无法使用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$" 

当Excel文件(我们是从第三方接收)开始含命名范围这已工作的罚款,直到最近。我没有隐藏的床单,我可以找到。

现在

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 2011-06-14 09:09:04

回答

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格式,我认为最快simpliest解决方案只是向下钻取到原始XML(记住XLSX只是ZIP)myFilename.xlsx/xl/workbook.xml使用,说,#ZipLib并从<sheets>节点抓取所有工作表名称。

+0

是的,我尝试过,但唯一的列包含非 - 空数据是TABLE_NAME,TABLE_TYPE(对于所有行是“TABLE”),DATE_CREATED和DATE_MODIFIED(全部相同)。所以我无法从这些获得任何有用的数据。 – openshac 2011-06-14 10:22:01

+0

如果它适用于您的解决方案,请参阅更新。 – 2011-06-14 10:49:32

+0

这是一个很好的解决方案,我会看看。 – openshac 2011-06-14 12:50:37

相关问题