python用pandas可直接导出sql查询结果到excel:先用pd.read_sql自动解析查询结果为带列名的dataframe,再用df.to_excel写入,无需手动处理类型或格式;需安装pandas及对应数据库驱动,并注意日期解析、数值精度、中文列名和大结果集分块写入等细节。

能直接导出,但必须明确两点:SQL查询结果本身不是文件,而是一个数据结构;Excel写入依赖第三方库,pandas 是最稳的选择——它把 pd.read_sql 和 df.to_excel 串起来,一行查询、一行写入,中间不用手动转格式。
用 pandas.read_sql 读取查询结果,别自己拼 cursor.fetchall()
自己用 cursor.execute() + fetchall() 拿到的是元组列表,列名得手动从 cursor.description 提,还要处理 None、日期、二进制等类型。而 pandas.read_sql 自动做这些事,返回带列名的 DataFrame,后续导出零阻力。
- 确保已安装
pandas和对应数据库驱动(如pyodbc、psycopg2、mysql-connector-python) -
read_sql第二个参数是connection对象,不是字符串连接串——传错会报AttributeError: 'str' object has no attribute 'cursor' - 如果 SQL 含参数,用
params=...传入,别用 Python 字符串格式化,防注入
to_excel 默认不带索引,但表头样式和数字精度要手动调
df.to_excel("output.xlsx", index=False) 能跑通,但实际交付常被退回:日期变成数字、金额少小数位、中文列名在 Excel 里挤成一团。这些问题不出现在控制台,只在打开 Excel 时暴露。
- 日期列用
parse_dates参数在read_sql阶段就解析好,否则导出后是datetime64[ns],Excel 可能识别为长数字 - 数值列精度靠
float_format="%.2f"控制,但注意这会把整数也补 .00;更稳妥是用style.format()配合ExcelWriter - 中文列名没问题,但若 Excel 打开提示“文件格式与扩展名不匹配”,大概率是没装
openpyxl(pip install openpyxl),to_excel默认用它写 .xlsx
大结果集导出卡死?换 chunksize + ExcelWriter
查出 10 万行以上直接 to_excel 容易内存爆掉或 Excel 打不开。这时不能硬扛,得流式写入:用 read_sql 的 chunksize 分批读,再用 ExcelWriter 追加写到同一个 sheet。
-
chunksize设为 5000~10000 较稳,太小 IO 多,太大仍占内存 -
ExcelWriter必须用engine="openpyxl",且写完要显式调用writer.close(),否则文件损坏 - 分批写时,只有第一块写表头(
header=True),后面设header=False,否则每块都重复列名
真正麻烦的不是语法,而是数据库字段类型和 Excel 单元格类型的隐式映射——比如 PostgreSQL 的 NUMERIC(10,2) 在 pandas 里是 decimal.Decimal,不转 float 就导不出;SQL Server 的 datetimeoffset 会直接报错。这些细节不报错、不警告,只让 Excel 里显示 #VALUE!。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











