Vb.net 使用OLEDB从Excel数据表获取数据
我有一个Excel2007XLSM文件,其中一个选项卡上有几个数据表。使用VB.NET,我试图一次读取一个表作为命名范围,如下所示:Vb.net 使用OLEDB从Excel数据表获取数据,vb.net,excel,datatable,oledb,Vb.net,Excel,Datatable,Oledb,我有一个Excel2007XLSM文件,其中一个选项卡上有几个数据表。使用VB.NET,我试图一次读取一个表作为命名范围,如下所示: Public Function OpeDataFromRange(ByVal Filename as string, ByVal RangeName As String, ByVal bColumnNames As Boolean) as DataTable ' Returns a DataSet containing information from a
Public Function OpeDataFromRange(ByVal Filename as string, ByVal RangeName As String, ByVal bColumnNames As Boolean) as DataTable
' Returns a DataSet containing information from a named range
' in the passed Excel worksheet
Dim sHDR As String
Dim strConn As String
If bColumnNames Then
sHDR = "Yes"
Else
sHDR = "No"
End If
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Filename & ";Extended Properties=""Excel 12.0 Macro;HDR=" & sHDR & """;"
Dim objConn _
As New System.Data.OleDb.OleDbConnection(strConn)
objConn.Open()
' Create objects ready to grab data
Dim objCmd As New System.Data.OleDb.OleDbCommand( _
"SELECT * FROM [" & RangeName & "]", objConn)
Dim objDA As New System.Data.OleDb.OleDbDataAdapter()
objDA.SelectCommand = objCmd
' Fill DataSet
Dim objDS As New System.Data.DataSet()
objDA.Fill(objDS)
' Clean up and return DataSet
objConn.Close()
return objDS
End Function
但我在Fill命令中得到错误:
Microsoft Office Access数据库引擎找不到对象“MyNamedTable1”。确保对象存在,并且正确拼写其名称和路径名
我试图在SELECT中读取整个表,然后通过objDS.Tables搜索出我的表,但是表中只加载了一个包含所有内容的表
有什么建议吗?您不能在Excel 12.0中使用Microsoft.Jet.OLEDB.4.0,您应该使用Microsoft.ACE.OLEDB.12.0 顺便说一句,您正在填充数据集,但返回的数据表需要更改其中一个数据集 就个人而言,我更喜欢使用DataTable,但您可能更喜欢数据集。如果要使用数据表,可以
Dim objDT As New DataTable
objDT.Load(objCmd.ExecuteReader)
首先打开选项Strict。您的函数定义为返回DataTable,但实际上返回的是一个数据集;在其中一个选项卡上,我有几个数据表,这太奇怪了。数据表是数据对象,没有UI显示,所以不清楚您有什么。它可能被称为MyNamedTable1$。使用objConn.GetSchemaTables获取文件中的表列表,并遍历它们以查看命名范围的名称。Ptutonix,是,函数应返回DataSet。我把它从这个帖子的一个Sub转换过来,我错过了。对于数据表,我指的是excel tables.Ciaran,我尝试从MyNamedTable1$中选择*,但在FROM子句中出现语法错误。我还尝试了从[MyNamedTable1$]中选择*,发现“MyNamedTable1$”不是有效名称。请确保它不包含无效字符或标点,并且不太长。Ciaran,我运行objConn.GetSchemaTables,列出的表主要对应于单个工作表的名称。还有一些其他名称,但这些名称不是我工作表中定义的表的名称,即不是公式->名称管理器中的名称。Aran,我确实尝试使用ACE.OLEDB。12.0,但我发现您找不到可安装的ISAM错误。我遵照本文的建议,切换到OLEDB 4.0,您是否真的安装了它?这几天很标准,但我想你可能没有。使用Regedit并查看是否有密钥。i、 e.HKEY\U CLASSES\U ROOT\Microsoft.ACE.OLEDB.12.0是的,已安装。我使用了另一种连接方式,使用OleDbConnectionStringBuilder,现在我可以使用ACE.OLEDB进行连接。12.0,但我在尝试查询我的表时遇到了相同的错误:Microsoft Office Access数据库引擎找不到对象“MyNamedTable1”。确保对象存在,并且正确拼写其名称和路径名。架构表中似乎没有列出表名。请参阅我关于使用GetSchema的评论。是否确实传递了正确的文件名,文件是否存在,以及您是否有权访问该文件?除此之外,我不知所措。你的代码对我来说很好用。