【发布时间】:2015-06-06 16:41:10
【问题描述】:
我有一个 excel 2007 xlsm 文件,其中一个选项卡上有几个数据表。使用 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 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 找出我的表,但是 Tables 只加载了一个包含所有内容的表。
有什么建议吗?
【问题讨论】:
-
首先打开 Option Strict。你的函数被定义为返回DataTable,但实际上你返回的是一个DataSet;
on one of the tabs I have several data tables这也很奇怪 DataTable 是数据对象,没有 UI 显示,所以不清楚你有什么。 -
它可能叫做 MyNamedTable1$。使用 objConn.GetSchema("Tables") 获取文件中的表列表并遍历它们以查看您的命名范围被称为什么。
-
Ptutonix,是的,该函数应该返回 DataSet。我正在为这篇文章将它从 Sub 转换,但我错过了它。我所说的数据表是指 Excel 表。
-
Ciaran,我尝试了“SELECT * FROM MyNamedTable1$”,但得到“FROM 子句中的语法错误”。我还尝试了“SELECT * FROM [MyNamedTable1$]”,但我得到“'MyNamedTable1$' 不是一个有效的名称。确保它不包含无效字符或标点符号,并且它不会太长。”
-
Ciaran,我运行 objConn.GetSchema("Tables") 并且列出的表主要对应于单个工作表的名称。还有一些其他名称,但这些不是我的工作表中定义的表(即不是来自公式->名称管理器的名称)
标签: vb.net excel datatable oledb