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

时间:2013-07-19 11:25:58

标签: sql excel delphi odbc

我正在尝试使用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才能使其生效。< / em>的

更新

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

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

2 个答案:

答案 0 :(得分:1)

请尝试以下方法来帮助您找出Delphi正在寻找的名称。

  1. 删除表单上的组合框。
  2. 运行以下代码,使用Delphi将接受的名称填充组合框:AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. 运行该应用。组合框应该为您提供可查询名称的列表。
  4. 使用Delphi XE2和Office 2010(excel文件保存为office 97 xls格式)我创建了一个范围名为range(sheet1!numberlist)的工作表,并在Delphi中运行了一个ADO查询。查询为SELECT * FROM [sheet1$numberlist]。也许这是你的ODBC驱动程序?

答案 1 :(得分:1)

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

  • myname
  • worksheet1!myname
  • worksheet2!myname

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

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

名称空间被夷为平地。

您只能查询SELECT * FROM myname。显然,这将返回定义的第一个名称的数据。

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)and can be downloaded separatly from Microsoft)附带的14版本Microsoft Office 2010的行为如下:

你确实可以查询所有这三个:

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

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

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

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