Python轻松实现将Excel数据批量导入数据库

 更新时间:2026年04月08日 11:55:55   作者:咕白m625  
在日常数据处理工作中,将 Excel 文件内容导入数据库是一个常见需求,本文将基于轻量级 Excel 处理库完成 Excel 文件解析,结合 Python 内置的 SQLite 数据库,实现多工作表自动识别、动态创建表结构、批量数据入库的完整方案,希望对大家有所帮助

在日常数据处理工作中,将 Excel 文件内容导入数据库是一个常见需求。Python 生态中虽然有 pandas、openpyxl 等成熟方案,但当遇到超大型 Excel 文件或需要精细控制单元格格式时,借助专用组件往往能提升开发效率。

本文基于轻量级 Excel 处理库完成 Excel 文件解析,结合 Python 内置的 SQLite 数据库(无需独立部署),实现多工作表自动识别、动态创建表结构、批量数据入库的完整方案。

一、应用场景与方案优势

适用场景

  1. 企业 Excel 报表数据迁移至数据库持久化存储;
  2. 自动化办公:定期将 Excel 导出数据同步到数据库;
  3. 轻量级数据中台:多 Excel 文件整合入库,方便后续查询分析; 4.测试数据构造:快速将 Excel 测试数据导入数据库。

方案核心优势

  1. 无环境依赖:无需安装 Microsoft Office/WPS,纯 Python 库解析 Excel;
  2. 多工作表适配:自动遍历 Excel 所有 sheet,无需手动指定;
  3. 动态建表:根据 Excel 表头自动生成数据库表结构;
  4. 安全稳定:参数化 SQL 防注入,事务管理保证数据一致性;
  5. 轻量免费:适用于中小型 Excel 文件处理,无额外成本。

二、环境准备

仅需安装 Excel 解析库(Free Spire.XLS for Python),SQLite 为 Python 内置库,无需额外安装:

pip install FreeSpire.XLS

三、核心执行流程

整个程序分为 5 个核心步骤,数据流转清晰无冗余:

加载Excel文件 → 连接数据库 → 遍历工作表 → 读取表头+动态建表 → 逐行数据插入 → 提交事务+释放资源

3.1 完整代码

from spire.xls import Workbook
import sqlite3

def excel_to_sqlite(excel_path, db_path):
    # 1. 加载 Excel 文件
    workbook = Workbook()
    workbook.LoadFromFile(excel_path)

    # 2. 连接数据库
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()

    # 3. 遍历每个工作表
    for sheet_index in range(workbook.Worksheets.Count):
        sheet = workbook.Worksheets.get_Item(sheet_index)
        sheet_name = sheet.Name.replace(" ", "")          # 表名中去掉空格

        # 4. 读取表头(第一行)
        header = []
        for col in range(sheet.AllocatedRange.ColumnCount):
            raw_value = sheet.Range[1, col + 1].Value
            # 字段名中去掉空格,并避免空字段
            field_name = raw_value.replace(" ", "") if raw_value else f"col_{col}"
            header.append(field_name)

        # 5. 创建数据库表(所有字段暂定为 TEXT 类型)
        create_sql = f"""
        CREATE TABLE IF NOT EXISTS {sheet_name} (
            {', '.join([f'[{h}] TEXT' for h in header])}
        )
        """
        cursor.execute(create_sql)

        # 6. 逐行插入数据(跳过表头行)
        for row in range(1, sheet.AllocatedRange.RowCount):  # row=1 对应 Excel 第二行
            row_data = []
            for col in range(sheet.AllocatedRange.ColumnCount):
                cell_value = sheet.Range[row + 1, col + 1].Value
                row_data.append(cell_value)
            
            # 使用参数化查询防止 SQL 注入
            placeholders = ','.join(['?' for _ in row_data])
            insert_sql = f"INSERT INTO {sheet_name} ({','.join(header)}) VALUES ({placeholders})"
            cursor.execute(insert_sql, row_data)

    # 7. 提交并清理
    conn.commit()
    conn.close()
    workbook.Dispose()

if __name__ == "__main__":
    excel_to_sqlite("Sample.xlsx", "output/Report.db")

3.2 关键点解析

1. 工作表遍历与表名清洗

workbook.Worksheets.Count 获取工作表总数,get_Item(s) 按索引获取。工作表名称可能包含空格、特殊字符,直接用作 SQLite 表名会导致语法错误,因此使用 .replace(" ", "") 去除空格。更严谨的做法可增加正则过滤,只保留字母数字和下划线。

2. 动态建表与字段类型

示例将所有字段定义为 TEXT 类型,适配 Excel 中字符串、数字、日期等通用格式(可根据业务修改数据类型)。

3. 数据读取的范围

sheet.AllocatedRange 返回已使用的单元格区域(包含数据的最大矩形),比直接遍历全部行列更高效。注意 RowCountColumnCount 是基于 1 的计数。

4. 参数化插入

使用 ? 占位符配合 cursor.execute(insert_sql, row_data) 能自动处理字符串转义,避免因 Excel 单元格内容包含单引号导致的 SQL 错误,同时防范注入风险。

四、扩展:适配其他数据库

只需修改数据库连接部分,即可迁移到 MySQL、PostgreSQL 等。注意不同数据库的标识符引用符不同(MySQL 用反引号 `,PostgreSQL 用双引号 "),以及字段类型映射的差异。例如连接 MySQL:

import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', db='test')
cursor = conn.cursor()
# 建表时将 [field] 改为 `field`

五、注意事项与最佳实践

  • 检查 Excel 列名与数据库表字段名是否匹配to_sql 默认使用 DataFrame 的列名作为数据库字段名,如果数据库表已存在且字段名不同,要么重命名 DataFrame 列,要么设置 if_exists='replace' 重建表。
  • 处理超大 Excel 文件pd.read_excel 会将整个文件加载到内存,如果 Excel 文件超过几百 MB,可以改用 openpyxl 的只读模式或分块读取。但更推荐将大 Excel 拆分成多个小文件,或者使用 dask
  • 事务处理to_sql 默认在自动提交模式下运行,如果中途出错,已写入的数据不会回滚。要保证原子性,可以手动管理事务(使用 engine.begin() 或连接对象的 begin())。
  • 性能对比:对于十万行以下的数据,to_sql 默认方式已经足够;对于百万行级别,建议使用 chunksize=5000 并配合数据库的批量提交优化。
  • 日志与错误处理:建议用 try...except 捕获异常,并记录失败的行或文件位置。

六、知识扩展

1.使用 executemany 手动批量插入

如果你需要更精细的控制(例如在插入前做复杂转换),也可以手动使用 cursor.executemany

import pymysql
import pandas as pd
df = pd.read_excel('data.xlsx')
records = df.to_dict('records')  # 转换为字典列表
conn = pymysql.connect(host='localhost', user='root', password='123456', database='test')
cursor = conn.cursor()
sql = "INSERT INTO table_name (col1, col2) VALUES (%s, %s)"
values = [(r['col1'], r['col2']) for r in records]
cursor.executemany(sql, values)
conn.commit()
cursor.close()
conn.close()

这种方式和 to_sql 的 chunksize 本质类似,但你可以自定义 SQL 语句。

2.从 Excel 批量导入 MySQL

import pandas as pd
from sqlalchemy import create_engine
# 读取 Excel
df = pd.read_excel('sales.xlsx')
# 确保日期列为 datetime
df['sale_date'] = pd.to_datetime(df['sale_date'])
# 连接 MySQL
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/testdb')
# 写入数据库(如果表存在则替换)
df.to_sql('sales', engine, if_exists='replace', index=False)
print("数据导入完成!")

七、结语

本文实现了一套轻量化、高可用的 Excel 数据导入数据库方案,核心优势为多工作表自动适配、动态表结构生成、安全的数据插入,代码简洁且易于二次开发。方案适用于日常数据迁移、报表导入等轻量级场景,无需复杂配置即可快速落地使用。

到此这篇关于Python轻松实现将Excel数据批量导入数据库的文章就介绍到这了,更多相关Python Excel数据导入数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python开发微信服务号消息推送示例

    python开发微信服务号消息推送示例

    这篇文章主要为大家介绍了python开发微信服务号消息推送示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • python中threading开启关闭线程操作

    python中threading开启关闭线程操作

    这篇文章主要介绍了python中threading开启关闭线程操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 插入排序_Python与PHP的实现版(推荐)

    插入排序_Python与PHP的实现版(推荐)

    下面小编就为大家带来一篇插入排序_Python与PHP的实现版(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python文件打包工具一站式指南

    Python文件打包工具一站式指南

    这篇文章主要为大家介绍了Python文件打包工具一站式指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python基于回溯法子集树模板解决找零问题示例

    Python基于回溯法子集树模板解决找零问题示例

    这篇文章主要介绍了Python基于回溯法子集树模板解决找零问题,简单描述了找零问题并结合具体实例形式分析了Python使用回溯法子集树模板解决找零问题的步骤、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Python真题案例之错位键盘 单词长度 字母重排详解

    Python真题案例之错位键盘 单词长度 字母重排详解

    这篇文章主要介绍了python实操案例练习,本文给大家分享的案例中主要任务有错位键盘、单词长度、字母重排,需要的小伙伴可以参考一下
    2022-03-03
  • pycharm 对代码做静态检查操作

    pycharm 对代码做静态检查操作

    这篇文章主要介绍了pycharm 对代码做静态检查操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python之停止打印日志/重复打印日志方式

    python之停止打印日志/重复打印日志方式

    这篇文章主要介绍了python停止打印日志/重复打印日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 基于Python fminunc 的替代方法

    基于Python fminunc 的替代方法

    今天小编就为大家分享一篇基于Python fminunc 的替代方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python使用SQLAlchemy连接ClickHouse数据库

    Python使用SQLAlchemy连接ClickHouse数据库

    ClickHouse是一个开源的列式数据库管理系统,以其高速的实时数据分析能力著称,本文主要介绍了Python使用SQLAlchemy连接ClickHouse数据库,感兴趣的可以了解一下
    2025-04-04

最新评论