我有多个包含多个工作表的 Excel 工作簿。我想将这些 Excel 工作簿转储到数据库中,同时保留跨 Excel 工作表的链接。例如,如果我的工作簿 A 包含工作表 B 和工作表 C,工作表 B 引用了工作表 C 中的某些内容,我希望数据库捕获工作表 B 和工作表 C 中包含的所有数据,同时也包括参考信息。
我对任何数据库都没有偏好,但我认为关系数据库最适合这项任务。要隔离多个工作簿,我认为最好的方法是每个工作簿都有一个架构?对于联系,我认为钥匙将是必经之路。我在数据库设计方面的知识非常有限,所以我的假设可能有很大偏差,这就是为什么我会感谢你的意见。
我正在寻找一个概念性的答案,但是任何可以提供随附 Python 代码的人都会加分。谢谢
在我看来,关系数据库将是这项任务的最佳选择,并且每个工作簿都有一个模式将是隔离多个工作簿的好方法。
要保留跨 Excel 工作表的链接,您可以在数据库架构中使用外键。外键是一种根据每个表中列的值将一个表链接到另一个表的方法。例如,如果工作表 B 有一个名为“工作表 C ID”的列,其中包含工作表 C 中与其链接的行的 ID,则可以在工作表 B 表中创建一个引用工作表中 ID 列的外键C表
这是使用 Python 将 Excel 工作簿转储到数据库中的一般方法:
psycopg2
、mysql-connector-python
或 sqlite3
)建立与数据库的连接。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 注入攻击。