需求:
Excel(.xlsx)中约有1000多万条数据,需要将数据插入到mysql数据库中,excel中第一个sheet页有表头,后面35个sheet页没有表头,需要将所有sheet页中的数据批量插入数据库。
实现
安装依赖:
pip install pandas
pip install openpyxl
pip install mysql-connector-python
python脚本
import pandas as pd
import mysql.connector
# 配置 MySQL 连接
def get_mysql_connection():
return mysql.connector.connect(
host='192.168.1.1',
user='用户',
password='密码',
database='数据库',
port= 端口号
)
# 批量插入数据到 MySQL
def insert_data_to_mysql(df, conn, batch_size=5000):
cursor = conn.cursor()
# 插入 SQL 语句,假设 temp 表结构为 (cons_id, record_date, record_usage)
insert_sql = "INSERT INTO temp11 (cons_id, record_date, record_usage) VALUES (%s, %s, %s)"
# 将 DataFrame 转换为列表格式
data = df[['OBJ_NO', 'DATE', 'VALUE']].values.tolist() # 只提取这三列
# 分批插入
for i in range(0, len(data), batch_size):
batch_data = data[i:i + batch_size]
cursor.executemany(insert_sql, batch_data) # 批量插入
conn.commit() # 提交事务
print(f"批量插入了 {len(batch_data)} 条数据")
# 读取 Excel 所有 sheet 页并插入 MySQL
def insert_excel_data_to_mysql(excel_file, conn, batch_size=5000):
# 读取 Excel 文件中所有的 sheet,返回一个字典 {sheet_name: DataFrame}
df_dict = pd.read_excel(excel_file, sheet_name=None, engine='openpyxl')
# 第一个 sheet 页处理(读取表头)
first_sheet_name = list(df_dict.keys())[0]
first_df = df_dict[first_sheet_name]
# 处理后续的 sheet 页(没有表头)
for sheet_name, df in df_dict.items():
print(f"正在处理 sheet: {sheet_name}")
# 如果是第一个 sheet,处理表头
if sheet_name == first_sheet_name:
df.columns = ['DATA_ID', 'OBJ_NO', 'OBJ_NAME', 'OBJ_TYPE', 'DATA_CODE', 'DATE', 'VALUE']
# 处理后续 sheet(没有表头,直接为列名)
else:
df.columns = ['DATA_ID', 'OBJ_NO', 'OBJ_NAME', 'OBJ_TYPE', 'DATA_CODE', 'DATE', 'VALUE']
# 提取所需的三列
df_filtered = df[['OBJ_NO', 'DATE', 'VALUE']]
# 插入数据到 MySQL,按批量大小进行插入
insert_data_to_mysql(df_filtered, conn, batch_size)
# 关闭 MySQL 连接
def close_connection(conn):
conn.close()
if __name__ == "__main__":
# 数据库连接
conn = get_mysql_connection()
try:
# 指定 Excel 文件路径
excel_file = '/Users/xxx/datas.xlsx'
# 批量大小,默认 1000 条
batch_size = 5000
# 将 Excel 数据批量插入 MySQL
insert_excel_data_to_mysql(excel_file, conn, batch_size)
finally:
# 关闭连接
close_connection(conn)