通过Python将Excel表格信息导入数据库
前言
公司原采用Excel表格方式记录着服务器资产信息,随着业务的增加,相应的硬件资产也增加,同时物理机虚拟化出多台虚拟机,存在表格管理杂乱、变更资产信息不能及时相互同步, 为了紧跟时代的步伐,老大搞了个基于Django框架的资产管理平台,用于记录资产信息;
而我负责将服务器信息梳理及将其信息录入到资产管理平台,在整理好Excel的基础上,个人初步了解下Django,得知通过操作页面手工录入的信息将存储到MySQL的指定库的指定表中,为了高效信息录入,笔者将使用Python将Excel表格中的资产信息导入到数据库中!
环境
1)确定要导入到数据库中的对应表的结构,如下:
2)根据表结构整理好对应的Excel表格,如下:
脚本
1 # -*- coding: utf-8 -*- 2 # Author: kazihuo 3 4 import pymysql 5 import xlrd 6 7 # 连接数据库 8 try: 9 db = pymysql.connect(host="10.2.5.200", user="root", 10 passwd="123456", 11 db="OPSINFO", 12 charset='utf8') 13 except: 14 print("could not connect to mysql server") 15 16 17 def open_excel(): 18 try: 19 book = xlrd.open_workbook("test.xlsx") 20 # test.xlsx是表格文件,当其不与此脚本在同一目录下时,需要写上其绝对路径 21 except: 22 print("open excel file failed!") 23 try: 24 sheet = book.sheet_by_name("ops-info") 25 # ops-info是表sheet名称,不理解的可看上图; 26 return sheet 27 except: 28 print("locate worksheet in excel failed!") 29 30 31 def insert_deta(): 32 sheet = open_excel() 33 cursor = db.cursor() 34 row_num = sheet.nrows 35 for i in range(1, row_num): 36 # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1 37 row_data = sheet.row_values(i) 38 value = (row_data[0], row_data[1], row_data[2], row_data[3], row_data[4], row_data[5]) 39 # value代表的是Excel表格中的每行的数据 40 print(i) 41 sql = 'INSERT INTO CN2Info_machins(Host,IP,IdracIP,Position,Rack,ST) VALUES(%s,%s,%s,%s,%s,%s)' 42 cursor.execute(sql, value) # 执行sql语句 43 db.commit() 44 cursor.close() # 关闭连接 45 46 47 open_excel() 48 insert_deta()
### 运行脚本后,可在数据库中看到对应信息,如下:
### 页面也出现对应信息,如下:
### 注意
因为表中的id是自增字段,故笔者在Python脚本中插入数据时,只写了对应需要插入的字段信息!
报错
笔者在操作过程中出现一些麻烦,报错如下:
pymysql.err.InternalError: (1136, "Column count doesn't match value count at row 1")
# 解决方法
报错原因在于插入数据时,插入的信息字段与数据库字段不一致,导致的原因可能是"Excel表格与数据库中表结构不对应" 或者 "脚本中的插入语句存在纰漏" ,当认真核对字段信息后再次操作,即可解决!
========================================
转载请保留此段声明,且在文章页面明显位置给出原文链接,谢谢!
==============================================================================
^_^ 如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,您的“推荐”将是我最大的写作动力 ^_^
==============================================================================