如何使用 Excel 2002 设置连接以查询 Excel .xls 文件中的数据?

How do I set up a connection to query data inside an Excel .xls file using Excel 2002?

我在 Excel 2002 年写了一个小应用程序,我需要以某种格式存储数字,它可以是一个字符串。 tables 我有一个 1:1 关系,而其他 table 只是一个列的 table,所以不需要使用访问权限,我必须有另一个文件我想避免。 所以,我想将它存储在单独的工作表中。

但是,我喜欢 SQL 查询的好处,我需要它。 我尝试使用一些 ADODB 连接字符串来实现这一点,但我无法实现。

我使用了以下代码:

 Dim cn As Object, rs As Object, output As String, sql As String
    
    '---Connecting to the Data Source---
    Set cn = CreateObject("ADODB.Connection")
    With cn
        .Provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;"
        .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & "Excel 8.0;HDR=Yes;IMEX=1"
        .Open
    End With

此外,我必须使用 ODBC 还是应该使用 OLE DB?我不知道是否可以使用 OLE DB 在 excel 个文件中进行查询。

此外,是否可以使用此 ODBC 或 OlE DB 对 SQL 进行插入? 我在连接字符串中尝试了不同的提供程序,并检查了 ADO 引用是否可用。

此外,我收到此错误: “错误 3706。找不到指定的提供程序。它可能没有正确安装。”

连接问题

首先,您的 Provider 字符串中存在错误,它不应包含带有 Data Source=C:\MyExcel.xls; 的部分,因为这是连接字符串的一部分。所以它应该是这样的:

    .Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
    .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & "Excel 8.0;HDR=Yes;IMEX=1"

ODBC 与 OLEDB

我从来没有用过ODBC,但是基于this answer,你不能用它来查询一个Excel文件,所以OLEDB是可行的。


插入语句

建立 ADODB 连接后,插入查询应该可以正常工作。我在下面提供了一个对我有用的示例,但有一些注意事项:

  • 我正在使用 ACE.OLEDB.12.0 而不是 JET.OLEDB.4.0 和 Excel for Microsoft 365 MSO(版本 2112 内部版本 16.0.14706.20000)64 -位 Windows 10.

  • 我建议在您的连接字符串中设置 Mode=ReadWrite 以避免潜在的写入权限问题(但即使没有它也可能工作。)。

  • 关于IMEX设置,我在设置IMEX=1的时候出现错误,所以我改成IMEX=0(见related question.

例子

使用名为 Data.xls 的工作簿,第一个 sheet 名为 Data 和以下数据:

Data for copy-paste

我可以运行以下内容:

Dim wb As Workbook
Set wb = Workbooks("Data.xls")
Dim ws As Worksheet
Set ws = wb.Worksheets("Data")

'Create connection
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
With conn
    .Provider = "Microsoft.ACE.OLEDB.12.0;"
    .ConnectionString = "Data Source=" & wb.FullName & ";" & "Excel 8.0;HDR=Yes;IMEX=0;Mode=ReadWrite;"
    .Open
End With

'Compose the INSERT statement.
Dim query As String
Const sep = ", "
query = "INSERT INTO [" & ws.Name & "$] " & _
    "(Id, Name, Age) " & _
    " VALUES (" & _
    4 & sep & _
    "'" & "Joe" & "'" & sep & _
    40 & _
    ")"

'Execute the statement.
conn.Execute query, adCmdText

'Close the connection
conn.Close

并且应该插入如下数据:


你应该使用 ACE 还是 JET?

如果 JET 适合您,您不妨使用它。基于 this article ,您还应该使用 Windows 7 提供 32 位版本的 ACE 以与 Excel 2002(32 位)一起使用,但根据您的评论,它似乎它导致了一些问题。

See also some interesting answer about JET vs ACE.