【问题标题】:What's the table name for a defined name in the scope of a worksheet?工作表范围内已定义名称的表名是什么?
【发布时间】:2013-07-18 16:07:18
【问题描述】:

我正在尝试使用 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 相同。

【问题讨论】:

  • 有人认为[worksheet1$myname] 不起作用?
  • 您是仅从 Delphi 中尝试过,还是从其他 MS Office 产品中尝试过?例如 MS Access?

标签: sql excel delphi odbc


【解决方案1】:

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

  1. 在表单上放置一个组合框。
  2. 运行以下代码以使用 Delphi 将接受的名称填充组合框:AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. 运行应用程序。组合框应为您提供可查询名称的列表。

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

【讨论】:

  • 确实有不同的ODBC驱动,我去看看。 GetTableNames 调用是个好主意。
  • 我使用的驱动是Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本12.00.6606.1000
【解决方案2】:

假设您有一个具有以下名称(Excel 公式表示法)的 Excel 文件(在我的例子中为 xlsx):

  • myname
  • worksheet1!myname
  • worksheet2!myname

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

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

命名空间是扁平的。

您可以查询的只有SELECT * FROM myname。显然,这会从定义的名字返回数据。

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

您确实可以查询所有三个:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多