需求:
Excel(.xlsx)中约有1000多万条数据,需要将数据插入到mysql数据库中,excel中第一个sheet页有表头,后面35个sheet页没有表头,需要将所有sheet页中的数据批量插入数据库。
实现
安装依赖:
pip install pandas
pip install openpyxl
pip install mysql-connector-python
python_10">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 数据批量插入 MySQLinsert_excel_data_to_mysql(excel_file, conn, batch_size)finally:# 关闭连接close_connection(conn)