如何使用 Python 将 Excel 工作簿转储到数据库中?

问题描述 投票:0回答:1

我有多个包含多个工作表的 Excel 工作簿。我想将这些 Excel 工作簿转储到数据库中,同时保留跨 Excel 工作表的链接。例如,如果我的工作簿 A 包含工作表 B 和工作表 C,工作表 B 引用了工作表 C 中的某些内容,我希望数据库捕获工作表 B 和工作表 C 中包含的所有数据,同时也包括参考信息。

我对任何数据库都没有偏好,但我认为关系数据库最适合这项任务。要隔离多个工作簿,我认为最好的方法是每个工作簿都有一个架构?对于联系,我认为钥匙将是必经之路。我在数据库设计方面的知识非常有限,所以我的假设可能有很大偏差,这就是为什么我会感谢你的意见。

我正在寻找一个概念性的答案,但是任何可以提供随附 Python 代码的人都会加分。谢谢

python-3.x excel database rdbms
1个回答
0
投票

在我看来,关系数据库将是这项任务的最佳选择,并且每个工作簿都有一个模式将是隔离多个工作簿的好方法。

要保留跨 Excel 工作表的链接,您可以在数据库架构中使用外键。外键是一种根据每个表中列的值将一个表链接到另一个表的方法。例如,如果工作表 B 有一个名为“工作表 C ID”的列,其中包含工作表 C 中与其链接的行的 ID,则可以在工作表 B 表中创建一个引用工作表中 ID 列的外键C表

这是使用 Python 将 Excel 工作簿转储到数据库中的一般方法:

  1. 选择要使用的关系数据库(例如 MySQL、PostgreSQL 或 SQLite),并使用 Python 库(例如
    psycopg2
    mysql-connector-python
    sqlite3
    )建立与数据库的连接。
  2. 对于每个 Excel 工作簿,在数据库中创建一个新架构以保存该工作簿中的数据。例如,您可以使用工作簿名称作为架构名称。
  3. 对于 Excel 工作簿中的每个工作表,在数据库架构中创建一个新表以保存该工作表中的数据。例如,您可以使用工作表名称作为表格名称。表格的列应与 Excel 工作表的列匹配。
  4. 使用
    openpyxl
    xlrd
    等Python库从Excel工作簿中读取数据并插入到相应的数据库表中。您可以使用循环遍历 Excel 工作表的行,并使用
    INSERT
    语句将每一行插入到数据库表中。如果工作表引用了另一个工作表,请使用外键将两个表链接在一起。

这里有一些示例 Python 代码可以帮助您入门,使用

openpyxl
从 Excel 工作簿中读取数据,并使用
psycopg2
将其插入
PostgreSQL
数据库:

import openpyxl
import psycopg2

# Connect to the PostgreSQL database
conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="myhost", port="myport")
cur = conn.cursor()

# Open the Excel workbook
workbook = openpyxl.load_workbook(filename="myworkbook.xlsx")

# For each sheet in the workbook
for sheetname in workbook.sheetnames:

    # Create a new table in the database schema to hold the data from the sheet
    tablename = sheetname.replace(" ", "_").lower()
    cur.execute(f"CREATE TABLE {tablename} (col1 TEXT, col2 INTEGER, col3 FLOAT)")

    # Read the data from the sheet and insert it into the database table
    sheet = workbook[sheetname]
    for row in sheet.iter_rows(values_only=True):
        cur.execute(f"INSERT INTO {tablename} (col1, col2, col3) VALUES (%s, %s, %s)", row)

    # If the sheet has a reference to another sheet
    if sheet.cell(row=1, column=1).value == "Sheet C ID":
        # Create a foreign key in the database table to link it to the other table
        cur.execute(f"ALTER TABLE {tablename} ADD FOREIGN KEY (sheet_c_id) REFERENCES sheet_c (id)")
    
# Commit the changes to the database
conn.commit()

# Close the database connection
cur.close()
conn.close()

Note
这只是一个示例,您需要修改代码以满足您的特定要求。此外,确保正确处理错误和异常,并清理所有用户输入以防止 SQL 注入攻击。

© www.soinside.com 2019 - 2024. All rights reserved.