在工作表范围内定义名称的表名是什么?

我正在尝试使用ODBC查询工作表范围中使用SQL定义的名称。

我已经知道这个工作:

SELECT * FROM [worksheet1$] -- Query a whole worksheet SELECT * FROM [worksheet1$A1:C10] -- Query A1:C10 of a worksheet SELECT * FROM myname -- Query a workbook scoped defined name 

请注意, myname是工作簿作用域,而不是工作表作用域。

我会期望像Excel公式中的东西一样适用于ODBC表名:

 SELECT * FROM worksheet1!myname -- Query a worksheet scoped defined name 

然而,这不起作用,我尝试了一些这样的语法变化。

这是可能的,如果是,使用什么语法?

对于Delphi开发人员的注意事项: A1:C10语法在TADOQuery造成麻烦,必须将ParamCheck设置为False才能使其工作。

更新:

我正在使用Microsoft Office 2007附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本12.00.6606.1000

我已经检查过,我正在使用的Delphi数据库组件的行为方式与Microsoft Query和Microsoft Access 2007相同。

尝试以下来帮助你找出Delphi正在寻找的名字。

  1. 在窗体上放置一个combobox。
  2. 运行下面的代码来填充名称为Delphi的combobox: AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. 运行应用程序。 combobox应该给你一个可查询名称的列表。

使用Delphi XE2和Office 2010(excel文件保存为office 97 xls格式)我创build了一个名为range(sheet1!numberlist)的工作表范围,并在Delphi中运行了一个ADO查询。 查询是SELECT * FROM [sheet1$numberlist] 。 也许这是你的ODBC驱动程序?

假设你有一个Excel文件(在我的情况下是xlsx),它具有以下名称(Excel公式表示法):

  • myname
  • worksheet1!myname
  • worksheet2!myname

不同版本的Excel ODBC驱动程序具有不同的行为:

Microsoft Office 2007附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本12行为如下所示:

命名空间被夷为平地

所有你可以查询的是SELECT * FROM myname 。 显然这将返回来自定义的名字的数据。

Microsoft Office 2010附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本14 ( 可以从Microsoft单独下载 )的行为如下所示:

你确实可以查询他们三个:

 SELECT * FROM myname SELECT * FROM [worksheet1$myname] SELECT * FROM [worksheet2$myname] 

所以这显然是在Microsoft Office 2010修复的。

该修补程序不向后兼容。 当您在2007年定义了一个工作表范围名称时,可以使用myname语法对其进行查询,该语法仅适用于2010年的工作簿范围名称。因此,在不同版本的Office中处理这种情况时需要谨慎。

注意:如果下载链接失效,请searchMicrosoft Access Database Engine 2010 Redistributable