Python从SQLite查询结果导出Excel文件
把SQLite查询结果直接导出成xlsx,支持多级表头、自动列宽、数字格式,适合每周给业务方出报表,不用再手动复制粘贴。
场景痛点
数据库里查出来的数据,业务方要Excel版本,每次手动SELECT、复制、粘贴到Excel、再调格式,一套下来十几分钟。用pandas把查询结果直接 to_excel,顺手把列宽、表头样式、数字格式都设好,跑完打开就是一份能直接发人的报表。
用到的库
pip install pandas openpyxl
完整代码
import sqlite3
from pathlib import Path
import pandas as pd
from openpyxl.styles import Font, Alignment, PatternFill
from openpyxl.utils import get_column_letter
DB_PATH = Path("sales.db")
OUT_PATH = Path("销售报表.xlsx")
def init_db():
"""初始化一份测试数据"""
conn = sqlite3.connect(DB_PATH)
df = pd.DataFrame({
"product": ["笔记本", "鼠标", "键盘", "笔记本", "鼠标", "键盘"],
"region": ["华北", "华东", "华南", "华北", "华南", "华东"],
"amount": [5999, 199, 499, 6299, 219, 549],
"qty": [1, 3, 2, 1, 2, 1],
})
df.to_sql("orders", conn, if_exists="replace", index=False)
conn.commit()
conn.close()
def query_to_excel():
"""执行SQL查询并导出Excel"""
conn = sqlite3.connect(DB_PATH)
# 汇总:按区域+产品统计金额与数量
sql = """
SELECT region AS 区域,
product AS 产品,
SUM(qty) AS 总数量,
SUM(amount) AS 总金额
FROM orders
GROUP BY region, product
ORDER BY 总金额 DESC
"""
df = pd.read_sql_query(sql, conn)
conn.close()
# 导出Excel,并用openpyxl做格式美化
with pd.ExcelWriter(OUT_PATH, engine="openpyxl") as writer:
df.to_excel(writer, index=False, sheet_name="销售汇总")
ws = writer.sheets["销售汇总"]
# 表头样式:加粗、灰底、居中
header_fill = PatternFill("solid", fgColor="D9D9D9")
for cell in ws[1]:
cell.font = Font(bold=True)
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center")
# 自动列宽
for col_idx, col in enumerate(df.columns, start=1):
max_len = max(
df[col].astype(str).map(len).max(),
len(str(col))
)
ws.column_dimensions[get_column_letter(col_idx)].width = max_len * 2 + 4
print(f"导出完成:{OUT_PATH.resolve()}")
if __name__ == "__main__":
init_db()
query_to_excel()
代码讲解
pd.read_sql_query(sql, conn)直接执行聚合SQL,返回的就是汇总后的DataFrame,不用在Python里再groupby一次。pd.ExcelWriter(path, engine="openpyxl")拿到writer对象,后续既能写DataFrame,又能拿到worksheet对象做样式设置。ws[1]取第一行(表头),用Font、PatternFill、Alignment设置加粗、灰底、居中。- 列宽根据每列最大字符长度估算,中文乘2,避免列太挤或太宽。
运行结果
脚本同目录生成 sales.db 和 销售报表.xlsx,打开Excel可见按区域+产品汇总的表,表头灰底加粗,列宽自适应,金额列右对齐。控制台打印文件绝对路径。
注意事项
- 导出前把列名改成中文(SQL里用
AS 中文名),业务方打开才看得懂。 - 金额、日期列在Excel里需要数字格式时,导出后用
ws["D2"].number_format = '#,##0.00'单独设置。 - 查询结果超过65536行时,老版
.xls放不下,用.xlsx格式没有行数限制。 - 一次性导出百万行级数据会占内存,必要时分sheet导出或直接用CSV格式。

更新时间:2026-09-14 20:54:20