Python-openpyxl读取Excel中数据写入MySQL的表中
实现功能:通过openpyxl读取Excel,并将数据写入MySQL表中。
说明: Excel中首行必须为表中的字段名称。因为向MySQL插入数据使用的是Insert 语句,插入的字段就是读取第一行的数据。
Python代码:
import pymysql from openpyxl import load_workbook def insert_excel_data_to_mysql(in_filename, in_host, in_user, in_password, in_database, in_table): # 连接数据库 mydb = pymysql.connect( host=in_host, # 数据库主机地址 user=in_user, # 数据库用户名 password=in_password, # 数据库密码 database=in_database # 数据库名称 ) # 创建游标对象 cursor = mydb.cursor() # 打开一个 Excel 文件 workbook = load_workbook(in_filename) # 选择第一个工作表 sheet = workbook.worksheets[0] # # 或者获取活动工作表 # sheet = workbook.active # 读取整行或整列数据 row_values = [cell.value for cell in sheet[1]] # 第一行数据 # column_values = [sheet[f'A{i}'].value for i in range(1, sheet.max_row + 1)] # A列数据 # 获取insert语句中Values(%s,%s)中%s占位符的个数 row_param = ['%s' for cell in sheet[1]] # 拼接插入数据的SQL语句 sql = "INSERT INTO {0} {1} VALUES {2};" # SQL插入语句 # 将语句进行格式化,并将字段名称和占位符的单引号替换成空 sql_format = sql.format(in_table, tuple(row_values), tuple(row_param)).replace("'", "") # 开始导入 # 输出导入文件 print("Import start from " + in_filename) # 输出导入表 print("Import table " + in_table) # 输出SQL语句模板 print("SQL:" + sql_format) # 输出导入字段 print("导入字段:" + str(row_values)) # 导入行数 add_row_count = 0 # 遍历Excel表格中的每一行,并将每一行插入到数据库中(从第2行开始) for row in sheet.iter_rows(values_only=True, min_row=2): add_row_count += 1 cursor.execute(sql_format, row) # 执行SQL插入语句 # 提交更改并关闭数据库连接 mydb.commit() # 提交更改 cursor.close() # 关闭游标对象 mydb.close() # 关闭数据库连接 # 打印结果提示 print("\033[92m" + "Added rows:" + str(add_row_count) + "\033[0m") print("\033[92m"+"Import successfully! " + "\033[0m") if __name__ == '__main__': # 需要输入的参数 filename = r'C:\\Users\\65742\\Desktop\\20240829\\断路器.xlsx' # Excel文件路径 host = "localhost" # 数据库主机地址 user = "root" # 数据库用户名 password = "Root@1234" # 数据库密码 database = "test" # 数据库名称 table = "test_excel_to_mysql" # 数据库表名 # 调用函数,将Excel数据插入到MySQL数据库中(Excel中第一行是表中的字段名称,第二行开始为数据) insert_excel_data_to_mysql(filename, host, user, password, database, table)
输出结果:
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/18394045