Python Excel数据导入SQLite数据库实战
用pandas读取Excel文件,清洗后一键写入SQLite,支持多sheet、表头跳过、类型指定,适合把零散Excel报表归档到本地数据库。
场景痛点
每个月各个部门发过来的Excel报表,文件名五花八门,要手动打开复制粘贴到数据库,重复劳动且容易漏行。用pandas读Excel再 to_sql 落库,一个脚本搞定,跑完直接在数据库里做汇总查询,不用再在几十个Excel文件里来回切。
用到的库
pip install pandas openpyxl
openpyxl 负责读写 .xlsx 文件。
完整代码
import sqlite3
from pathlib import Path
import pandas as pd
DB_PATH = Path("import.db")
XLSX_PATH = Path("sales.xlsx")
def create_sample_excel():
"""造一份示例Excel,实际使用时替换成真实文件路径"""
if XLSX_PATH.exists():
return
df = pd.DataFrame({
"订单号": ["SO001", "SO002", "SO003", "SO004"],
"客户": ["甲公司", "乙公司", "丙公司", "甲公司"],
"商品": ["笔记本", "鼠标", "笔记本", "键盘"],
"数量": [10, 50, 5, 20],
"金额": [59990, 9950, 29995, 9980],
})
df.to_excel(XLSX_PATH, index=False, sheet_name="1月")
def excel_to_sqlite():
"""读取Excel全部sheet,写入SQLite"""
# 读取所有sheet,返回 dict[sheet名 -> DataFrame]
sheets = pd.read_excel(XLSX_PATH, sheet_name=None)
conn = sqlite3.connect(DB_PATH)
for sheet_name, df in sheets.items():
# 清理列名:去掉前后空格
df.columns = [str(c).strip() for c in df.columns]
# 去掉全空行
df = df.dropna(how="all")
# 指定表名,sheet名可能含中文,用英文表名更稳妥
table_name = "orders"
df.to_sql(table_name, conn, if_exists="append", index=False)
print(f"sheet[{sheet_name}] 写入 {len(df)} 行")
conn.commit()
conn.close()
def verify():
"""验证导入结果"""
conn = sqlite3.connect(DB_PATH)
df = pd.read_sql_query("SELECT 客户, COUNT(*) AS 单数, SUM(金额) AS 总额 FROM orders GROUP BY 客户", conn)
print(df)
conn.close()
if __name__ == "__main__":
create_sample_excel()
excel_to_sqlite()
verify()
代码讲解
pd.read_excel(path, sheet_name=None)一次读入所有sheet,返回字典,key是sheet名,value是DataFrame。sheet_name="Sheet1"只读指定sheet;sheet_name=0读第一个sheet。df.columns = [str(c).strip() ...]去掉列名前后空格,Excel从系统导出的表经常带空格导致后续SQL字段报错。df.dropna(how="all")删除整行都是空值的行,Excel末尾常见的空行不会进库。to_sql(..., if_exists="append")追加模式,多个sheet或多个文件往同一张表灌数据,不会覆盖已有内容。
运行结果
脚本同目录生成 sales.xlsx 示例文件和 import.db 数据库,控制台打印每个sheet写入行数,最后输出按客户汇总的订单数和金额。多次运行同一文件会重复追加,测试时注意。
注意事项
- Excel列名有中文时,SQL里直接写中文字段名没问题,但跨工具(如BI软件)可能乱码,建议落库前把列名改成英文。
- 日期列在Excel里是字符串时,落库前用
pd.to_datetime(df["下单日期"])转一下,否则SQLite里是TEXT无法做日期范围查询。 - 大Excel(超过10万行)读取会慢,pandas默认全量读入,必要时用
usecols只读需要的列,或chunksize分块读。 if_exists="replace"会清空整表,批量导入前先确认表名,别把历史数据冲掉。

更新时间:2026-09-14 21:01:20