我的知识记录

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] 取第一行(表头),用 FontPatternFillAlignment 设置加粗、灰底、居中。
  • 列宽根据每列最大字符长度估算,中文乘2,避免列太挤或太宽。

运行结果

脚本同目录生成 sales.db销售报表.xlsx,打开Excel可见按区域+产品汇总的表,表头灰底加粗,列宽自适应,金额列右对齐。控制台打印文件绝对路径。

注意事项

  • 导出前把列名改成中文(SQL里用 AS 中文名),业务方打开才看得懂。
  • 金额、日期列在Excel里需要数字格式时,导出后用 ws["D2"].number_format = '#,##0.00' 单独设置。
  • 查询结果超过65536行时,老版 .xls 放不下,用 .xlsx 格式没有行数限制。
  • 一次性导出百万行级数据会占内存,必要时分sheet导出或直接用CSV格式。

Python从SQLite查询结果导出Excel文件

标签:

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

上一篇:Python写入CSV文件教程:csv模块与pandas两种写法

下一篇:Python操作SQLite数据库增删改查完整教程