使用Excel作为ODBC数据库

时间:2013-04-05 22:25:21

标签: database windows excel ms-access odbc

我想知道,如何在Excel中创建数据库表,以便它可以与ODBC一起使用

我想使用ODBC,我有两个选项,MS Access或Excel,

您可能知道,为了将某些MS Access文件或Excel文件指示为ODBC源,您需要遵循:

管理工具 - >数据源(ODBC) - >选择用户DSN - >从列表中选择“Excel文件”或“MS Access数据库” - >按'配置' - >最后选择文件(MS Access或Excel)作为ODBC源

嗯,它可以正常使用MS Access,我可以连接到该文件并查看我在里面创建的所有表格

但是当谈到Excel时,虽然我可以连接到该文件,但我看不到我在里面创建的表

我刚刚在“插入”标签中使用了“表格”,添加了一些标题作为列名,并给出了表格 一个有意义的名字那是这样做的吗?

3 个答案:

答案 0 :(得分:13)

有几种方法可以在Excel工作簿中引用“表格”数据:

  • 整个工作表。
  • 工作表上指定的单元格范围。
  • 工作表上未命名的单元格范围。

Microsoft知识库文章257819中的“使用代码选择Excel数据”部分对此进行了详细说明。

最直接的方法是将数据保存在单独的工作表上,将列名放在第一行(从单元格A1开始),然后让实际数据从第2行开始,如下所示

Excel

为了测试,我创建了一个名为“odbcFromExcel”的用户DSN,指向该工作簿......

ODBC

...然后运行以下VBScript来测试连接:

Option Explicit
Dim con, rst, rowCount
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT * FROM [Sheet1$]", con
rowCount = 0
Do While Not rst.EOF
    rowCount = rowCount + 1
    If rowCount = 1 Then
        Wscript.Echo "Data row 1, rst(""LastName"").Value=""" &  rst("LastName").Value & """"
    End If
    rst.MoveNext
Loop
Wscript.Echo rowCount & " data rows found."
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

结果

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
10 data rows found.

我希望这可以帮助您解决Excel连接问题。

作为最后的评论,我不得不说,如果你正在做一些需要“几秒钟”才能在Excel中完成但在“Access中需要大约20-25分钟”的事情,那么我强烈怀疑你在使用Access一种非常低效的方式,但这是另一个问题的主题(如果你想要追求它)。

修改

如果要将数据插入Excel工作簿,那么这是可能的,但请注意,Excel ODBC连接的默认设置是“只读”,因此您必须单击“选项>>”按钮并清除该复选框:

readonly

完成后,以下代码......

Option Explicit
Dim con
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
con.Execute "INSERT INTO [Sheet1$] (ID, LastName, FirstName) VALUES (11, 'Dumpty', 'Humpty')"
con.Close
Set con = Nothing
Wscript.Echo "Done."

...确实会在Excel工作表中添加一行并提供相应的数据。

但是,当您将“嗅探器”应用程序指向Excel ODBC DSN时,仍然无法解决没有“表格”可供选择的问题。

您可以尝试的一件事是在第1行创建一个带有列标题的Excel工作表,然后选择那些整列并创建一个Excel“已定义的名称”。然后,看看您的“嗅探器”应用程序是否将其识别为您可以选择的“表格”名称。

FWIW,我在Excel工作簿中将名称myTable定义为=Sheet1!$A:$C,然后在使用时我的原始代码 排序 有效SELECT * FROM [myTable]

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
1048576 data rows found.

正如您所看到的,它正确地检索了第一个“记录”,但它无法识别有效数据的结尾并继续读取表格中的~100万行。

我非常怀疑我会为此付出更多努力,因为我同意其他使用Excel作为“ODBC数据库”的评论并不是一个好主意。

我强烈建议您尝试找出您之前尝试使用Access的原因如此令人不满意。正如我之前所说的那样,听起来像是在与Access进行交互时做了非常糟糕的工作

答案 1 :(得分:1)

我最近遇到了类似的问题。我设法绕过它的方法是选择数据作为范围A1:XY12345,然后使用“定义名称”工具命名范围。当您通过ODBC连接到Excel工作簿时,此命名范围将显示为“表”,而您实际定义(每个Excel)作为表的范围则不会。

答案 2 :(得分:-1)

您只需从excel文件的第一行中选择所需的列,然后在左侧的公式栏的编辑框中为其命名。当然,你也给文件的每一列命名了一个名字!