【问题标题】:Getting data from an Excel datatable using OLEDB使用 OLEDB 从 Excel 数据表中获取数据
【发布时间】: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


【解决方案1】:

您不能将 Microsoft.Jet.OLEDB.4.0 与 Excel 12.0 一起使用,您应该改用 Microsoft.ACE.OLEDB.12.0。

顺便说一句,您正在填充一个 DataSet 但返回一个 DataTable 您需要更改其中一个。

我个人更喜欢为此使用 DataTable,但您可能更喜欢 DataSet。如果您想使用 DataTable,您可以...

Dim objDT As New DataTable
objDT.Load(objCmd.ExecuteReader)

【讨论】:

  • Ciaran,我确实尝试过使用 ACE.OLEDB。 12.0,但我收到“找不到可安装的 ISAM”错误。我按照本文的建议切换到 OLEDB 4.0 social.msdn.microsoft.com/Forums/en-US/…
  • 你真的安装了吗?这些天它很标准,但我想你可能没有它。使用 Regedit 并查看您是否有它的密钥。即 HKEY_CLASSES_ROOT\Microsoft.ACE.OLEDB.12.0
  • 是的,它已安装。我使用了另一种连接方式,使用 OleDbConnectionStringBuilder,现在我可以使用 ACE.OLEDB 进行连接。 12.0 ,但我在尝试查询我的表时遇到了同样的错误:“Microsoft Office Access 数据库引擎找不到对象'MyNamedTable1'。确保该对象存在并且您正确拼写了它的名称和路径名。”似乎 Schema 表中没有列出表名(请参阅我关于使用 GetSchema 的评论)。
  • 您确定您传递了正确的文件名、该文件存在并且您可以访问它吗?除此之外,我不知所措。你的代码对我来说很好用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多