一、需求背景与技术选型
在日常数据处理工作中,将分散的Excel数据批量导入数据库进行统一管理是高频需求。SQLite作为轻量级嵌入式数据库,无需独立服务器、配置简单,适合小型数据存储场景;Python则凭借丰富的第三方库,能高效实现Excel读取与数据库操作的衔接。
本次方案将采用openpyxl库读取Excel文件(专注处理.xlsx格式,轻量且速度快),搭配Python内置的sqlite3模块操作数据库,通过executemany()方法实现批量插入,同时通过减少事务提交次数优化导入速度。
二、前期准备
(一)环境配置
安装依赖库:打开命令行,执行以下命令安装
openpyxl库:
pip install openpyxl
sqlite3是Python标准库,无需额外安装。
数据准备:
整理需要导入的Excel文件,建议统一放在一个文件夹中(如命名为
excel_data),确保文件格式为.xlsx。确保所有Excel文件的表头一致,且与后续创建的数据库表字段对应。例如,Excel表头为
姓名、年龄、部门、入职日期,数据库表也需包含对应字段。
三、核心代码实现步骤
(一)创建SQLite数据库表
首先需要创建与Excel数据结构匹配的数据库表。以下代码将创建一个名为employee的表,用于存储员工信息:
import sqlite3
def create_table():
# 连接到SQLite数据库(不存在则自动创建)
conn = sqlite3.connect('company.db')
cursor = conn.cursor()
# 创建员工表
create_sql = '''
CREATE TABLE IF NOT EXISTS employee (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
department TEXT,
hire_date TEXT
)
'''
cursor.execute(create_sql)
# 提交事务并关闭连接
conn.commit()
conn.close()
print("数据库表创建成功!")
if __name__ == '__main__':
create_table()
(二)读取单个Excel文件数据
使用openpyxl读取Excel文件内容,将数据转换为可直接插入数据库的格式。这里通过生成器逐行读取数据,减少内存占用:
from openpyxl import load_workbook
def read_excel(file_path):
# 加载Excel文件,开启只读模式提升大文件读取速度
wb = load_workbook(filename=file_path, read_only=True)
# 获取第一个工作表
ws = wb.active
# 跳过表头(第一行),从第二行开始读取数据
for row in ws.iter_rows(min_row=2, values_only=True):
# 过滤空行
if any(cell is not None for cell in row):
# 返回元组格式数据,适配executemany方法
yield row, row, row^2^, row
# 关闭文件
wb.close()
(三)批量导入单文件数据到数据库
将读取到的Excel数据批量插入SQLite数据库,使用executemany()方法替代逐行插入,同时减少事务提交次数:
import sqlite3
def import_to_sqlite(data_generator, db_path='company.db'):
# 连接数据库
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 批量插入SQL语句
insert_sql = '''
INSERT INTO employee (name, age, department, hire_date)
VALUES (?, ?, ?, ?)
'''
try:
# 执行批量插入
cursor.executemany(insert_sql, data_generator)
# 提交事务
conn.commit()
print(f"成功插入{cursor.rowcount}条数据")
except Exception as e:
# 发生异常回滚事务
conn.rollback()
print(f"数据导入失败,错误信息:{e}")
finally:
# 关闭连接
conn.close()
(四)整合功能实现单文件导入
将上述函数整合,实现从指定Excel文件导入数据到数据库的完整流程:
if __name__ == '__main__':
# 1. 创建数据库表
create_table()
# 2. 指定Excel文件路径
excel_file = 'excel_data/员工信息.xlsx'
# 3. 读取Excel数据并导入数据库
data_gen = read_excel(excel_file)
import_to_sqlite(data_gen)
四、关键优化点说明
批量插入优化:使用
executemany()方法一次性执行多条插入语句,相比逐行调用execute(),能大幅减少数据库交互次数,提升导入速度。事务提交策略:默认情况下,
sqlite3会在每次执行语句后自动提交事务。本次方案在批量插入完成后统一提交事务,避免频繁提交带来的性能损耗。只读模式读取Excel:开启
read_only=True模式读取Excel文件,尤其在处理大文件时,能显著降低内存占用,提升读取效率。生成器逐行读取:通过生成器
yield逐行返回数据,无需将整个Excel文件加载到内存,适合处理超大Excel文件。
五、常见问题与解决方法
Excel文件格式不兼容:确保文件为.xlsx格式,若为.xls格式,需改用
xlrd库(注意需安装1.2.0版本,高版本不再支持.xls)。数据类型不匹配:插入数据时需确保Excel数据类型与数据库表字段类型一致,例如Excel中的日期需转换为字符串格式后再插入。
主键冲突:若数据库表设置了主键,导入时需避免重复数据,可在插入前先查询数据库,或使用
INSERT OR IGNORE语句忽略重复数据。