总结在 Excel 中使用 SQL 语句的四种方法,各种方法都有各自的适用场景,可以选择自己熟悉的或喜欢方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下,使用微软 SQLExpress 版本。

方法 1: Excel 现有连接功能

点击浏览更多按钮,在出现下面的界面后,新建一个 sql server 的连接: 输入要连接的sql server服务器,以及连接方式: 在下一步,选择数据库,选择表:

然后一路下一步,将数据放在希望的工作表: 默认情况下,显示的是一个表,我们可以通过右键菜单进行修改:

进入的时候,是这样的: 我们将命令类型改为 SQL,然后在命令文本中写入合法的 sql 语句:

这样就可以了。这个方法的数据源也可以是 Excel 工作簿,灵活性还是不错的。但如果用 Excel 作为数据源,工作表名称后面需要加上$符号。

下面演示将 Excel 工作簿作为数据源。点击数据选项卡的现有连接,将类型改为所有文件或者Excel文件,直接找到有数据的 Excel 工作簿。

选择表格:

可以把 Excel 工作簿的数据源当做表格,用 SQL 语句操作:

显示的结果如下:

方法2: ADO

使用 ADO 操作数据,需要编写 VBA 代码,但灵活性更高,甚至可以封装成函数。有两个知识点:

连接字符串的写法参照 ADO 库

连接字符串可以使用方法1的 OLEDB 连接字符串。也可以使用另外一种方法:新建一个扩展名为 udl 的文件,然后双击,出现下面的界面,填写好相应的字段: 点击测试连接,测试是否可以连接成功。然后用文本编辑器打开 udl 文件,获取连接字符串:

第二个知识点是在 VBE 环境中加载 ADO 库。方法如下,打开 Excel 文件后,按 ALT + F11 进入 VBE 环境,然后通过菜单工具->引用,选中 Microsoft ActiveX Data Object 库的应用,有不同的版本,可以选择高一点的版本:

以下是示例代码,代码比较简单,不做讲解。

Public Sub ImportData()

Dim conn As New ADODB.Connection

conn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=SimpleStockManager;Data Source=LAPTOP-1VEJV1RM\SQLEXPRESS"

Dim rst As New ADODB.Recordset

conn.Open

rst.Open "select * from t_m_materials", conn, adOpenKeyset, adLockReadOnly

' print headers

Dim i As Integer

Dim leftTopCell As Range

Set leftTopCell = Sheet1.Range("A1")

For i = 0 To rst.Fields.Count - 1

leftTopCell.Offset(0, i).Value = rst.Fields(i).Name

Next

' import data

leftTopCell.Offset(1, 0).CopyFromRecordset rst

End Sub

方法3:利用 Power Query

首先获取数据库的连接:

填写服务器名称,数据库可以选填。

点击确定按钮,在下面的界面中选择 t_m_materials 表,然后点击加载按钮。 此时,加载的是表,按下 ALT + F12 进入 Power Query 编辑器,在高级编辑器中,将自动生成的代码进行改写,改写后 M 代码如下:

let

Source = Sql.Database("LAPTOP-1VEJV1RM\SQLEXPRESS", "SimpleStockManager"),

dbo_t_m_materials = Value.NativeQuery(Source, "select MaterialNo, MaterialDesc from t_m_materials")

in

dbo_t_m_materials

通过 M 语言的 Value.NativeQuery 函数,使用 SQL 语句获取数据。这种方法还是比较简单的。

方法4:pandas + xlwings

如果熟悉 Python 语言,那么使用 pandas 库,结合 xlwings 的功能,使用起来就更简单了。在安装了 pandas 库和 xlwings 库之后,先在 CMD 窗口中运行下面的命令,创建一个 xlsm 文件以及同名的 py 文件:

xlwings quickstart UseSql

打开 UseSql.py ,编写如下代码:

import xlwings as xw

from sqlalchemy import create_engine

import pandas as pd

engine = create_engine('mssql+pymssql://username:pwd@localhost:10577/SimpleStockManager?charset=utf8')

def main():

# do nothing

@xw.func

def read_sql(sql):

df = pd.read_sql(sql, engine)

return df

if __name__ == "__main__":

xw.Book("UseSql.xlsm").set_mock_caller()

main()

只需要几句代码,就编写了一个可以根据 sql 语句获取数据的函数。在 Excel 中使用效果如下: