JS宏连接数据库:QueryTables的成员
一、QueryTable简介
在前面的课程中,我们学习了 QueryTables 对象。这是一个 集合对象,它的主要作用是存储和管理当前工作表中所有的 查询表(QueryTable)。
简单来说,每当你从外部数据源(比如网页、数据库或文本文件)向 ET 工作表中导入数据时,ET就会为你创建一个对应的 QueryTable 对象,而所有这些对象就组成了一个集合,也就是 QueryTables 集合。
并且,我们会使用 QueryTables 中的 add 方法来给他添加成员,添加的成员就是 QueryTable。
二、QueryTable中的属性
对于QueryTable中的属性,官方文档有较为详细的介绍,如下表所示:
| 名称 | 说明 |
| AdjustColumnWidth | 如果每次刷新指定的查询表时列宽都会自动调整为最适合的宽度,则为 True。如果每次刷新时列宽不进行自动调整,则为 False。默认值为 True。Boolean 类型,可读写。 |
| Application | 如果不与对象识别符一起使用,则此属性返回代表 ET 应用程序的 Application对象。如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可对 OLE 自动操作对象使用此属性来返回该对象的应用程序)。只读。 |
| BackgroundQuery | 如果查询表的查询是异步执行(在后台执行)的,则为 True。Boolean 类型,可读写。 |
| CommandText | 返回或设置指定数据源的命令串。Variant 型,可读写。 |
| CommandType | 返回或设置备注部分的下表中列出的 XlCmdType 常量之一。返回或设置的常量用于描述 CommandText 属性的值。默认值为 xlCmdSQL。XlCmdType 类型,可读写。 |
| Connection | 返回或设置包含下列某项的字符串:允许 ET 连接到 OLE DB 数据源的 OLE DB 设置;允许 ET 连接到 ODBC 数据源的 ODBC 设置;允许 ET 连接到 Web 数据源的 URL;或者文本文件的名称或路径,或是指定某个数据库或 Web 查询的文件名称或路径。Variant 型,可读写。 |
| Creator | 返回一个 32 位整数,该整数指示在其中创建此对象的应用程序。只读 Long 类型。 |
| Destination | 返回查询表目标区域(查询结果表放置的区域)的左上角单元格。目标区域必须位于包含 QueryTable 对象的工作表中。Range 类型,只读。 |
| EnableEditing | 如果允许用户对指定查询表进行编辑,则该值为 True;如果用户只能刷新查询表,则该值为 False。Boolean 类型,可读写。 |
| EnableRefresh | 如果用户可刷新数据透视表高速缓存或查询表,则为 True。默认值为 True。Boolean 类型,可读写。 |
| FetchedRowOverflow | 如果上次使用 Refresh 方法返回的行数比工作表中可用行数大,则该值为 True。Boolean 类型,只读。 |
| FieldNames | 如果数据源的字段名称作为返回数据的列标题显示,则该值为 True。默认值为 True。Boolean 类型,可读写。 |
| FillAdjacentFormulas | 如果每当查询表刷新时,指定查询表右侧的公式就自动更新,则该属性值为 True。默认值为 True。Boolean 类型,可读写。 |
| ListObject | 为 QueryTable 对象返回一个 ListObject 对象。ListObject 对象类型,只读。 |
| MaintainConnection | 如果从刷新数据开始直至关闭工作簿,都一直保留指向指定数据源的连接,则为 True。默认值是 True。Boolean 类型,可读写。 |
| Name | 返回或设置一个 String 值,它代表对象的名称。 |
| Parent | 返回指定对象的父对象。只读。 |
| PostText | 返回或设置用于 post 方法的字符串,post 方法用于向 Web 服务器输入数据以从 Web 查询中返回数据。String 类型,可读写。 |
| PreserveColumnInfo | 如果每次刷新查询表时,列排序、筛选和布局信息都会保留,则该值为 True。默认值为 False。Boolean 类型,可读写。 |
| PreserveFormatting | 如果将数据前五行的任何常用格式设置应用到查询表的新数据行,则为 True。对未使用的单元格不进行格式设置。如果将应用到查询表的最新一次自动套用格式应用于新数据行,则属性为 False。默认值是 True。 |
| QueryType | 表示 ET 填充查询表时所使用的查询类型。XlQueryType 类型,只读。 |
| RefreshOnFileOpen | 如果每次打开工作簿时,数据透视表高速缓存或查询表自动更新,则为 True。默认值为 False。Boolean 类型,可读写。 |
| RefreshPeriod | 返回或设置两次刷新之间的时间间隔。Long 型,可读写。 |
| RefreshStyle | 返回或设置为了容纳查询返回的记录集中的行数而在指定工作表中插入或删除行时所使用的方式。XlCellInsertionMode 类型。可读写。 |
| Refreshing | 如果指定的查询表正在进行后台查询,则为 True。 Boolean 类型,只读。 |
| ResultRange | 返回一个 Range 对象,该对象代表指定查询表所覆盖的工作表区域。只读。 |
| RobustConnect | 返回或设置数据透视表缓存与其数据源连接的方式。XlRobustConnect 类型,可读写。 |
| RowNumbers | 如果行号作为第一列添加到指定查询表,则该属性值为 True。Boolean 类型,可读写。 |
| SaveData | 如果将查询表的数据随工作簿一起保存,则为 True。如果仅保存查询表的定义,则为 False。Boolean 类型,可读写。 |
| SavePassword | 如果将 ODBC 连接字符串中的密码信息与指定查询一起保存,则为 True。如果不保存密码信息,则该值为 False。Boolean 类型,可读写。 |
| SourceConnectionFile | 返回或设置一个 String 值,它指明用于创建查询表的 ET 数据连接文件或类似文件。可读写。 |
| SourceDataFile | 返回或设置一个 String 值,它指明查询表的源数据文件。 |
| TextFileColumnDataTypes | 返回或设置一个有序的常量数组,用于指定文本文件中相应列的数据类型,而该文本文件则是正要导入查询表中的文本文件。每一列的默认常量为 xlGeneral。Variant 类型,可读写。 |
| TextFileCommaDelimiter | 如果将文本文件导入查询表中时,以逗号作为分隔符,则该值为 True。如果以其他字符作为分隔符,则该值为 False。默认值为 False。Boolean 类型,可读写。 |
| TextFileConsecutiveDelimiter | 当向查询表中导入文本文件时,如果将连续分隔符看作是一个分隔符,则该值为 True。默认值为 False。Boolean 类型,可读写。 |
| TextFileDecimalSeparator | 返回或设置小数分隔符,在将文本文件导入查询表中时,ET 将使用小数分隔符。默认值为系统小数分隔符。String 类型,可读写。 |
| TextFileFixedColumnWidths | 返回或设置一个整数数组,该数组对应于正要向查询表中导入的文本文件的列宽(按字符)。有效的宽度为 1 到 32767 个字符。Variant 类型,可读写。 |
| TextFileOtherDelimiter | 返回或设置在向查询表中导入文本文件时用作分隔符的字符。默认值为 null。String 类型,可读写。 |
| TextFileParseType | 返回或设置要导入查询表的文本文件中数据的列格式。XlTextParsingType类型,可读写。 |
| TextFilePlatform | 返回或设置正向查询表中导入的文本文件的原始格式。该属性确定在数据导入过程中使用何种代码页。XlPlatform 类型,可读写。 |
| TextFilePromptOnRefresh | 如果每次刷新查询表时都要指定导入文本文件的名称,则该属性值为 True。**“导入文本文件”**对话框允许用户指定路径和文件名。默认值为 False。Boolean 类型,可读写。 |
| TextFileSemicolonDelimiter | 如果在将文本文件导入查询表时使用分号作为分隔符,并且 TextFileParseType 属性的值为 xlDelimited,则为 True。默认值为 False。Boolean 类型,可读写。 |
| TextFileSpaceDelimiter | 如果向查询表中导入文本文件时,使用空格字符作为分隔符,则该值为 True。默认值为 False。Boolean 类型,可读写。 |
| TextFileStartRow | 返回或设置向查询表中导入文本文件时进行文本分列的起始行号。其有效值为 1 到 32767 之间的整数。默认值为 1。Long 类型,可读写。 |
| TextFileTabDelimiter | 如果向查询表中导入文本文件时使用 Tab 作为分隔符,则该值为 True。默认值为 False。Boolean 类型,可读写。 |
| TextFileTextQualifier | 返回或设置向查询表中导入文本文件时的文本识别符。文本识别符用于指定包含的数据是文本格式。XlTextQualifier类型,可读写。 |
| TextFileThousandsSeparator | 返回或设置向查询表中导入文本文件时 ET 所使用的千位分隔符。默认为系统千位分隔符。String类型,可读写。 |
| TextFileTrailingMinusNumbers | 如果为 True,ET 会将导入的数字视为以 - (减) 符号开头的文本作为负号。 如果为 False,则将导入的数字视为以 - 符号开头的文本作为文本。Boolean 类型,可读写。 |
| WebConsecutiveDelimitersAsOne | 当从网页的 HTML <PRE> 标记中向查询表导入数据时,如果将连续多个分隔符看作单个分隔符,并且数据将被分列,则该值为 True。如果将连续多个分隔符看作多个分隔符,则该值为 False。默认值是 True。可读/写 Boolean 类型。 |
| WebDisableDateRecognition | 向查询表中导入网页时,如果将类似日期的数据当作文本进行处理,则该值为 True。如果使用了日期识别,则该值为 False。默认值为 False。Boolean 类型,可读写。 |
| WebDisableRedirections | 如果对 QueryTable 对象禁用 Web 查询重定向,则该属性的值为 True。默认值为 False。Boolean 类型,可读写。 |
| WebFormatting | 返回或设置一个值,该值确定向查询表中导入网页时网页中应用了多少格式设置(如果有)。XlWebFormatting 类型,可读写。 |
| WebPreFormattedTextToColumns | 返回或设置向查询表中导入网页时,是否对网页 HTML <PRE> 标记内的数据进行分列。默认值为 True。Boolean 类型,可读写。 |
| WebSelectionType | 返回或设置一个值,该值决定是向查询表中导入整个网页、网页上的所有表格还是仅网页上的特定表格。XlWebSelectionType 类型,可读写。 |
| WebSingleBlockTextImport | 向查询表中导入网页时,如果位于指定网页的 HTML <PRE> 标记中的数据是同时进行处理的,则该值为 True。如果数据是以连续行的数据块方式导入的,以便能识别标题行,则该值为 False。默认值为 False。Boolean 类型,可读写。 |
| WebTables | 向查询表中导入网页时,返回或设置由逗号分隔的表格名称或表格索引号的列表。String 类型,可读写。 |
| WorkbookConnection | 返回查询表所使用的 WorkbookConnection 对象。只读。 |
在这里,我们着重了解几个常用且与数据库连接相关的属性。
2.1、Connection属性
它的作用是获取或修改连接字符串,例如:原来工作表上的连接是关于sql server数据库的连接,那么,你可以通过它,修改为关于mysql数据库的连接。代码如下所示:
// 建立一个sql server相关连接
function test_sqlserver() {let connstr = "OLEDB;Provider=MSOLEDBSQL.1;Password=********;Persist Security Info=True;User ID=****;Initial Catalog=*****;\Data Source=***********;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=**********;Use Encryption for Data=False;\Tag with column collation when possible=False;MARS Connection=False;DataTypeCompatibility=0;Trust Server Certificate=False;Application Intent=READWRITE\;MultiSubnetFailover=False;Use FMTONLY=False;TransparentNetworkIPResolution=True;Connect Retry Count=1;Connect Retry Interval=10";let qyTb = Worksheets.Item(3).QueryTables.Add(connstr, Sheets(3).Range("A1"), "select distinct sj 市级 from uf_scrl where tbsj='2025-11-01'");qyTb.Name = "sqlServer";qyTb.Refresh(true);
}// 修改连接
function changeConn() {let connection = "ODBC;DSN=ai_32;MaxBufferSize=2048;PageTimeout=5;";let qyTable = Application.Worksheets.Item(3).QueryTables.Item("sqlServer");console.log(qyTable.Connection);qyTable.Connection = connection; // 修改为ODBC连接,连接mysql数据库qyTable.CommandText = "select id, name from ai_api_key";console.log(qyTable.Connection);qyTable.Refresh(true);
}
执行效果:



2.2、CommandType和CommandText
这两个属性是相辅相成的,CommandType决定你命令语句的类型,它是一个枚举常量,如下表所示:
| 名称 | 值 | 说明 |
|---|---|---|
| xlCmdCube | 1 | 包含一个 OLAP 数据源多维数据集名称。 |
| xlCmdDefault | 4 | 包含 OLE DB 提供程序可识别的命令文本。 |
| xlCmdList | 5 | 包含指向列表数据的指针。 |
| xlCmdSql | 2 | 包含一个 SQL 语句。 |
| xlCmdTable | 3 | 包含用于访问 OLE DB 数据源的表名称。 |
连接数据库,执行数据库语句我们使用xlCmdSql。
CommandText 是一个字符串,可读写,代表你的命令语句,在连接Sql数据库时它是一个Sql语句。可以增删改查,支持事务回滚,创建函数和存储过程等都可以。
示例代码:
function test_sqlserver() {let connstr = "你的连接字符串";let qyTb = Worksheets.Item(4).QueryTables.Add(connstr, Sheets(4).Range("A1"), undefined);qyTb.CommandType = xlCmdSql;qyTb.CommandText = "create view vw_test as select distinct sj 市级 from uf_scrl where tbsj='2025-11-01'"; // 创建一个视图qyTb.Name = "sqlServer";qyTb.Refresh(false); // 这里会抛出异常,因为没有数据返回给工作表,不过视图可以成功创建
}


三、QueryTable中的方法
QueryTable中,只有两个方法,一个是Delete,用于删除对象,非常简单。另一个是Refresh,这个相对重要,不过也很容易理解,主要作用就是更新外部数据区域,也就是将外部数据获取到工作表内,没有外部数据返回就报错了,它只有一个参数,如下表所示:
| 名称 | 必选/可选 | 数据类型 | 说明 |
|---|---|---|---|
| BackgroundQuery | 可选 | any | 只用于基于 SQL 查询结果的 QueryTables。如果为 True,则在数据库建立连接并提交查询之后,将控制返回给过程。QueryTable 在后台进行更新。如果为 False,则在所有数据被取回到工作表之后,将控制返回给过程。如果没有指定该参数,则由 BackgroundQuery 属性的设置决定查询模式。 |
