灵飞猫 發表於 2026-4-8 10:17:00

使用 Python 将 Excel 数据批量导入到数据库中(SQLite)

<p>在日常数据处理工作中,将 Excel 文件内容导入数据库是一个常见需求。Python 生态中虽然有 pandas、openpyxl 等成熟方案,但当遇到超大型 Excel 文件或需要精细控制单元格格式时,借助专用组件往往能提升开发效率。</p>
<p>本文基于轻量级 Excel 处理库完成 Excel 文件解析,结合 Python 内置的 SQLite 数据库(无需独立部署),实现多工作表自动识别、动态创建表结构、批量数据入库的完整方案。</p>
<h2 id="一应用场景与方案优势">一、应用场景与方案优势</h2>
<h3 id="适用场景">适用场景</h3>
<ol>
<li>企业 Excel 报表数据迁移至数据库持久化存储;</li>
<li>自动化办公:定期将 Excel 导出数据同步到数据库;</li>
<li>轻量级数据中台:多 Excel 文件整合入库,方便后续查询分析;<br>
4.测试数据构造:快速将 Excel 测试数据导入数据库。</li>
</ol>
<h3 id="方案核心优势">方案核心优势</h3>
<ol>
<li>无环境依赖:无需安装 Microsoft Office/WPS,纯 Python 库解析 Excel;</li>
<li>多工作表适配:自动遍历 Excel 所有 sheet,无需手动指定;</li>
<li>动态建表:根据 Excel 表头自动生成数据库表结构;</li>
<li>安全稳定:参数化 SQL 防注入,事务管理保证数据一致性;</li>
<li>轻量免费:适用于中小型 Excel 文件处理,无额外成本。</li>
</ol>
<h2 id="二环境准备">二、环境准备</h2>
<p>仅需安装 Excel 解析库(Free Spire.XLS for Python),SQLite 为 Python 内置库,无需额外安装:</p>
<pre><code class="language-bash">pip install FreeSpire.XLS
</code></pre>
<h2 id="三核心执行流程">三、核心执行流程</h2>
<p>整个程序分为 5 个核心步骤,数据流转清晰无冗余:</p>
<p><strong>加载Excel文件 → 连接数据库 → 遍历工作表 → 读取表头+动态建表 → 逐行数据插入 → 提交事务+释放资源</strong></p>
<h3 id="31-完整代码">3.1 完整代码</h3>
<pre><code class="language-python">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.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( 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.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")
</code></pre>
<h3 id="32-关键点解析">3.2 关键点解析</h3>
<p><strong>1. 工作表遍历与表名清洗</strong><br>
<code>workbook.Worksheets.Count</code> 获取工作表总数,<code>get_Item(s)</code> 按索引获取。工作表名称可能包含空格、特殊字符,直接用作 SQLite 表名会导致语法错误,因此使用 <code>.replace(" ", "")</code> 去除空格。更严谨的做法可增加正则过滤,只保留字母数字和下划线。</p>
<p><strong>2. 动态建表与字段类型</strong><br>
示例将所有字段定义为 <code>TEXT</code> 类型,适配 Excel 中字符串、数字、日期等通用格式(可根据业务修改数据类型)。</p>
<p><strong>3. 数据读取的范围</strong><br>
<code>sheet.AllocatedRange</code> 返回已使用的单元格区域(包含数据的最大矩形),比直接遍历全部行列更高效。注意 <code>RowCount</code> 和 <code>ColumnCount</code> 是基于 1 的计数。</p>
<p><strong>4. 参数化插入</strong><br>
使用 <code>?</code> 占位符配合 <code>cursor.execute(insert_sql, row_data)</code> 能自动处理字符串转义,避免因 Excel 单元格内容包含单引号导致的 SQL 错误,同时防范注入风险。</p>
<h2 id="四扩展适配其他数据库">四、扩展:适配其他数据库</h2>
<p>只需修改数据库连接部分,即可迁移到 MySQL、PostgreSQL 等。注意不同数据库的标识符引用符不同(MySQL 用反引号 <code>`</code>,PostgreSQL 用双引号 <code>"</code>),以及字段类型映射的差异。例如连接 MySQL:</p>
<pre><code class="language-python">import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', db='test')
cursor = conn.cursor()
# 建表时将 改为 `field`
</code></pre>
<h2 id="结语">结语</h2>
<p>本文实现了一套轻量化、高可用的 Excel 数据导入数据库方案,核心优势为多工作表自动适配、动态表结构生成、安全的数据插入,代码简洁且易于二次开发。方案适用于日常数据迁移、报表导入等轻量级场景,无需复杂配置即可快速落地使用。</p><br><br>
来源:https://www.cnblogs.com/jazz-z/p/19833934
頁: [1]
查看完整版本: 使用 Python 将 Excel 数据批量导入到数据库中(SQLite)