├── README.md ├── example.sql ├── example.xlsx ├── imgs ├── README.md ├── excel源数据.png ├── export.gif ├── export1.gif ├── export_release.gif ├── sql_生成文件.png ├── 导出结果.png └── 数据库中数据.png ├── readout.py ├── readout.sql ├── readout.xlsx ├── writein.py ├── xlsx2sql.py └── xlsx2sql_test.py /README.md: -------------------------------------------------------------------------------- 1 | # Excel-MySQL-tool 2 | :sparkles:Excel一键导入MySQL数据库,MySQL数据库一键读取到Excel表格。 3 | 4 | ## 依赖 5 | - Python2.7.11 环境 6 | - xlrd 7 | - xlwt 8 | - MySQLdb 9 | 10 | ## mysql-->>excel 11 | 12 | - 首先将`readout.py`导入到你的工作目录下 13 | - `host` 数据库访问链接,远程的使用IP也是可以的 14 | - `user` 数据库用户名 15 | - `password` 数据库密码 16 | - `db` 要操作的数据库名称 17 | - `output_file` excel文件输出完整路径 18 | 19 | - 然后使用如下的调用语句即可。 20 | ``` 21 | # 结果测试 22 | if __name__ == "__main__": 23 | export('localhost','root','mysql','test','datetest',r'datetest.xlsx') 24 | 25 | ``` 26 | 27 | ## excel -->> MySQL 28 | 29 | - 首先也是导入`xlsx2sql.py`。 30 | - 然后就可以使用如下的语句来实现咯。 31 | ``` 32 | from xlsx2sql import XlsxTool,Xlsx2sql 33 | tool = XlsxTool() 34 | table_header_type = ['int(100) not null','varchar(255) ','varchar(255)','varchar(255)','varchar(30)','varchar(30)','varchar(100) not null'] 35 | release = Xlsx2sql(tool) 36 | release.generate(r'./readout.xlsx',table_header_type,"id",r'./readout.sql') 37 | 38 | ``` 39 | 40 | 41 | ## 案例展示 42 | ## 图片展示 43 | 44 | 由于数据库输出到excel比较简单,这里就简单的展示一下excel转换成数据库的案例吧。 45 | 46 | - excel原始内容 47 | ![Excel数据源](http://img.blog.csdn.net/20160822214106332) 48 | 49 | 50 | - 运行完刚才的示例代码后会在当前目录下生成一个readout.sql文件,复制里面的内容到数据库中。 51 | ![输出结果](https://github.com/guoruibiao/Excel-MySQL-tool/raw/master/imgs/export_release.gif) 52 | -------------------------------------------------------------------------------- /example.sql: -------------------------------------------------------------------------------- 1 | create table example(姓名 varchar(100) not null ,年龄 int(100) ,籍贯 varchar(255) ,手机号码 varchar(100) ,primary key(姓名));insert into example(姓名,年龄,籍贯,手机号码) values('mark',12.0,'大连市',156048637.0);insert into example(姓名,年龄,籍贯,手机号码) values('张三',20.0,'北京市',1827890234.0);insert into example(姓名,年龄,籍贯,手机号码) values('李四',29.0,'深圳市',1632434098.0); -------------------------------------------------------------------------------- /example.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/example.xlsx -------------------------------------------------------------------------------- /imgs/README.md: -------------------------------------------------------------------------------- 1 | 存放测试过程中的截图。 2 | -------------------------------------------------------------------------------- /imgs/excel源数据.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/excel源数据.png -------------------------------------------------------------------------------- /imgs/export.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/export.gif -------------------------------------------------------------------------------- /imgs/export1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/export1.gif -------------------------------------------------------------------------------- /imgs/export_release.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/export_release.gif -------------------------------------------------------------------------------- /imgs/sql_生成文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/sql_生成文件.png -------------------------------------------------------------------------------- /imgs/导出结果.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/导出结果.png -------------------------------------------------------------------------------- /imgs/数据库中数据.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/imgs/数据库中数据.png -------------------------------------------------------------------------------- /readout.py: -------------------------------------------------------------------------------- 1 | # coding:utf8 2 | import sys 3 | 4 | reload(sys) 5 | sys.setdefaultencoding('utf8') 6 | # __author__ = '郭 璞' 7 | # __date__ = '2016/8/20' 8 | # __Desc__ = 从数据库中导出数据到excel数据表中 9 | 10 | import xlwt 11 | import MySQLdb 12 | 13 | def export(host,user,password,dbname,table_name,outputpath): 14 | conn = MySQLdb.connect(host,user,password,dbname,charset='utf8') 15 | cursor = conn.cursor() 16 | 17 | count = cursor.execute('select * from '+table_name) 18 | print count 19 | # 重置游标的位置 20 | cursor.scroll(0,mode='absolute') 21 | # 搜取所有结果 22 | results = cursor.fetchall() 23 | 24 | # 获取MYSQL里面的数据字段名称 25 | fields = cursor.description 26 | workbook = xlwt.Workbook() 27 | sheet = workbook.add_sheet('table_'+table_name,cell_overwrite_ok=True) 28 | 29 | # 写上字段信息 30 | for field in range(0,len(fields)): 31 | sheet.write(0,field,fields[field][0]) 32 | 33 | # 获取并写入数据段信息 34 | row = 1 35 | col = 0 36 | for row in range(1,len(results)+1): 37 | for col in range(0,len(fields)): 38 | sheet.write(row,col,u'%s'%results[row-1][col]) 39 | 40 | workbook.save(outputpath) 41 | 42 | 43 | # 结果测试 44 | if __name__ == "__main__": 45 | export('localhost','root','mysql','test','datetest',r'datetest.xlsx') -------------------------------------------------------------------------------- /readout.sql: -------------------------------------------------------------------------------- 1 | create table readout(id int(100) not null ,msg varchar(255) ,sender varchar(255) ,receiver varchar(255) ,color varchar(30) ,biaoqing varchar(30) ,add_time varchar(100) not null ,primary key(id));insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(1,'这是一条聊天信息','mark','jenny','#453400','苦笑','2016-08-16 08:14:28');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(2,'这是一条聊天信息','mark','jenny','#453400','苦笑','2016-08-16 08:14:28');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(3,'这是一条聊天回复信息','jenny','mark','#6e6e6e','微笑','2016-08-16 08:15:10');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(4,'这个聊天室做的还行哈','Tom','Mark','#321234','哈哈大笑','2016-08-16 08:17:22');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(5,'这个聊天室做不赖','Tom','Mark','#321234','哈哈大笑','2016-08-16 08:18:10');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(6,'谢谢','mark','jenny','green','大笑','2016-08-16 09:22:18');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(7,'大舍大得','Mark','小郭','#ffff80','猥琐地','2016-08-16 10:23:01');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(8,'阿斯顿撒','Mark','','#80ff00','微笑地','2016-08-16 10:23:21');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(9,'大','Mark','','#ff80ff','微笑地','2016-08-16 10:24:24');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(10,'阿斯顿','Mark','','#ff0080','微笑地','2016-08-16 10:25:34');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(11,'','Mark','','','','2016-08-16 10:28:07');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(12,'chatroom_insert.php','Mark','小郭','#00ff00','猥琐地','2016-08-16 10:29:30');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(13,'hahhahah','Mark','大郭','#8000ff','猥琐地','2016-08-16 10:30:29');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(14,'看来还得优化一下!','Mark','小郭','#f8f807','猥琐地','2016-08-16 10:33:58');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(15,'是的啊,需要优化一下了!','Mark','小郭','#ffff00','和蔼地','2016-08-16 10:34:59');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(16,'嘻嘻','Mark','老郭','#ffffff','微笑地','2016-08-16 10:35:32');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(17,'呵呵','Mark','','#00ffff','微笑地','2016-08-16 10:41:28');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(18,'真的假的啊?','Mark','小郭','#ff8000','猥琐地','2016-08-16 10:43:47');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(19,'老郭,你好啊','Mark','老郭','#00ff00','猥琐地','2016-08-16 11:00:55');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(20,'小郭,今天的作业是什么?','Mark','小郭','#ff00ff','猥琐地','2016-08-16 11:03:45');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(21,'哈哈哈啊哈哈哈吧 2 | ','Mark','老郭','','猥琐地','2016-08-16 12:53:19');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(22,'不喜欢西红柿上班','Mark','大郭','#12345','目不转睛地','2016-08-16 12:54:16');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(23,'Ajax实现的小小聊天室','Mark','小郭','#804040','和蔼地','2016-08-16 14:48:38');insert into readout(id,msg,sender,receiver,color,biaoqing,add_time) values(24,'嘻嘻嘻','Mark','老郭','#0000ff','猥琐地','2016-08-16 15:21:46'); -------------------------------------------------------------------------------- /readout.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guoruibiao/Excel-MySQL-tool/00a371055769ee6d0ae0ea257ce2d389c10e04ba/readout.xlsx -------------------------------------------------------------------------------- /writein.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import sys 3 | 4 | reload(sys) 5 | sys.setdefaultencoding('utf8') 6 | # __author__ = '郭 璞' 7 | # __date__ = '2016/8/20' 8 | # __Desc__ = 将excel上的数据读入到数据库 9 | 10 | import xlrd 11 | import MySQLdb 12 | 13 | # 读取EXCEL中的数据到数据库中 14 | workbook = xlrd.open_workbook(r'./example.xlsx') 15 | table = workbook.sheet_by_index(0) 16 | 17 | table_header = [] 18 | table_body = [] 19 | table_rows = table.nrows 20 | table_cols = table.ncols 21 | # 获取excel的表头信息,将作为存储与数据库中的字段 22 | table_header = table.row_values(0) 23 | print '字段信息:\n', 24 | str = '' 25 | for item in table_header: 26 | str += item 27 | str += " " 28 | print '\n',str 29 | # 获取excel中所有数据 30 | def getDataByRow(table,table_rows,table_body): 31 | for row_number in range(1,table_rows): 32 | table_body.append(table.row_values(row_number)) 33 | return table_body 34 | 35 | table_body = getDataByRow(table=table,table_rows=table_rows,table_body=table_body) 36 | for item in table_body: 37 | row = '' 38 | for i in item: 39 | row =row + u'%s'%i 40 | row += " " 41 | print row 42 | 43 | table_header_type = ['varchar(100)','int(100)','varchar(255)','varchar(100)'] 44 | 45 | # ------------------------------开始处理数据库相关 46 | # 判断当前项是否为数字,整形或者是浮点型的数字均可以判断 47 | def isnum(protype): 48 | import re 49 | # 调用正则 50 | reg = re.compile(r'^[-+]?[0-9]+?\.[0-9]+?$') 51 | result = reg.match(protype) 52 | if result: 53 | return True 54 | else: 55 | return False 56 | 57 | # 将一个包含任意类型的数组,转化成可以作为插入数据库的值的串 58 | def arr2str(arr): 59 | fields = '' 60 | for item in range(len(arr)): 61 | arr_item =u'%s'%arr[item] 62 | if isnum(arr_item) or arr_item.isdigit(): 63 | pass 64 | else: 65 | arr_item ="'"+u'%s'%arr_item+"'" 66 | fields += arr_item + "," 67 | return fields.rstrip(',') 68 | 69 | conn = MySQLdb.connect('localhost','root','mysql','test') 70 | cursor = conn.cursor() 71 | print cursor 72 | # 创建数据库表 73 | def createTable(cursor,table_name,table_header,table_header_type,primary_key=None): 74 | sql = "create table "+u'%s'%table_name+"(" 75 | for item in range(len(table_header)): 76 | sql = sql + u'%s'%table_header[item] + " "+ u'%s'%table_header_type[item]+" ," 77 | sql += "primary key("+u'%s'%primary_key+")" 78 | sql +=");" 79 | print sql 80 | # cursor.execute(sql) 81 | 82 | 83 | # 将数据存储进数据库 84 | def storeData(cursor,table_name,table_header,table_body): 85 | for row in range(len(table_body)): 86 | values = arr2str(table_body[row]) 87 | 88 | fields = "" 89 | for item in range(len(table_header)): 90 | if (item+1) == len(table_header): 91 | fields +=(u'%s'%table_header[item]) 92 | else: 93 | fields += (u'%s' % table_header[item] + ",") 94 | fields.rstrip(",") 95 | sql = 'insert into '+ table_name+'('+u'%s'%fields+')' + ' values('+u'%s'%values+');' 96 | print sql 97 | # cursor.execute(sql) 98 | 99 | 100 | createTable(cursor,'example',table_header,table_header_type,table_header[0]) 101 | storeData(cursor,'example',table_header,table_body) 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /xlsx2sql.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import sys 3 | import os 4 | reload(sys) 5 | sys.setdefaultencoding('utf8') 6 | # __author__ = '郭 璞' 7 | # __date__ = '2016/8/22' 8 | # __Desc__ = 根据给定的excel表格,一键导出为可执行的sql语句,用来给用户一个查看以及修改的机会,减少出错的可能性。 9 | import xlrd 10 | 11 | # 判断当前项是否为数字,整形或者是浮点型的数字均可以判断 12 | def isnum(protype): 13 | import re 14 | # 调用正则 15 | reg = re.compile(r'^[-+]?[0-9]+?\.[0-9]+?$') 16 | result = reg.match(protype) 17 | if result: 18 | return True 19 | else: 20 | return False 21 | 22 | # 将一个包含任意类型的数组,转化成可以作为插入数据库的值的串 23 | def arr2str(arr): 24 | fields = '' 25 | for item in range(len(arr)): 26 | arr_item =u'%s'%arr[item] 27 | if isnum(arr_item) or arr_item.isdigit(): 28 | pass 29 | else: 30 | arr_item ="'"+u'%s'%arr_item+"'" 31 | fields += arr_item + "," 32 | return fields.rstrip(',') 33 | 34 | # 根据excel的路径生成数据库表的表名称 35 | def get_table_name_from_excelpath(excel_path): 36 | if excel_path == None: 37 | print u'%s'%("未指定Excel的完整路径\n") 38 | exit(0) 39 | else: 40 | excel_name = excel_path.split('/')[-1].strip('.xlsx') 41 | return excel_name 42 | 43 | class XlsxTool(): 44 | 45 | # 初始化相关参数 46 | def __init__(self): 47 | self.table_header = [] 48 | self.xlsx_name = None 49 | self.table_header_type = [] 50 | self.table_body = [] 51 | self.table = None 52 | self.table_rows = None 53 | self.table_cols = None 54 | self.table_name = None 55 | self.sql_create_table = "" 56 | self.sql_data_inflate = [] 57 | 58 | # 从给定的路径中读取excel数据表,并将数据读取到init之后的变量中,方便下文的使用 59 | def readxlsx(self,xlsx_name=None): 60 | if type(xlsx_name)==None: 61 | print u'%s'%("excel表名称为空,请检查后重试!\n") 62 | exit(0) 63 | else: 64 | self.xlsx_name = xlsx_name 65 | self.table_name = get_table_name_from_excelpath(xlsx_name) 66 | workbook = xlrd.open_workbook(self.xlsx_name) 67 | self.table = workbook.sheet_by_index(0) 68 | self.table_rows = self.table.nrows 69 | self.table_cols = self.table_cols 70 | self.table_header = self.table.row_values(0) 71 | 72 | for row in range(1,self.table_rows): 73 | self.table_body.append(self.table.row_values(row)) 74 | 75 | # 根据传进来的表的头的类型,生成数据库中的建表字段。注意传入的类型一定要符合数据库的语段要求 76 | def create_table(self,table_header_type,primary_key_name=None): 77 | if table_header_type == None: 78 | print u'%s'%("数据库表头类型为必须项,且为按照数据库语句规则的列表!\n") 79 | exit(0) 80 | else: 81 | self.table_header_type = table_header_type 82 | # 创建数据库表 83 | sql = "create table " + u'%s' % self.table_name + "(" 84 | for item in range(len(self.table_header)): 85 | sql = sql + u'%s' % self.table_header[item] + " " + u'%s' % self.table_header_type[item] + " ," 86 | sql += "primary key(" + u'%s' % primary_key_name + ")" 87 | sql += ");" 88 | self.sql_create_table = sql 89 | 90 | # 将excel表格中的所有的数据,生成insert 语句,为接下来的向数据库中导入数据做准备 91 | def create_insert_sqls(self): 92 | 93 | for row in range(len(self.table_body)): 94 | values = arr2str(self.table_body[row]) 95 | 96 | fields = "" 97 | for item in range(len(self.table_header)): 98 | if (item + 1) == len(self.table_header): 99 | fields += (u'%s' % self.table_header[item]) 100 | else: 101 | fields += (u'%s' % self.table_header[item] + ",") 102 | fields.rstrip(",") 103 | sql = 'insert into ' + self.table_name + '(' + u'%s' % fields + ')' + ' values(' + u'%s' % values + ');' 104 | self.sql_data_inflate .append(sql) 105 | 106 | 107 | class Xlsx2sql(): 108 | 109 | def __init__(self,xlsxtool): 110 | self.xlsxtool = xlsxtool 111 | 112 | def generate(self,excel_file_path,table_header_type,primary_key_name,output_sql_file): 113 | self.xlsxtool.readxlsx(excel_file_path) 114 | self.xlsxtool.create_table(table_header_type=table_header_type,primary_key_name=primary_key_name) 115 | self.xlsxtool.create_insert_sqls() 116 | generate_data = self.xlsxtool.sql_create_table 117 | for item in range(len(self.xlsxtool.sql_data_inflate)): 118 | generate_data+=self.xlsxtool.sql_data_inflate[item] 119 | print self.xlsxtool.sql_data_inflate[item] 120 | file = open(output_sql_file,'wb') 121 | file.write(generate_data) 122 | file.close() 123 | print "尊敬的用户,%s Excel表中的数据已成功转换成,生成文件的路径为:%s,待导入数据库执行的sql文件," \ 124 | "请检查语法合格后导入数据库!\n"%(excel_file_path,output_sql_file) 125 | -------------------------------------------------------------------------------- /xlsx2sql_test.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import sys 3 | 4 | reload(sys) 5 | sys.setdefaultencoding('utf8') 6 | # __author__ = '郭 璞' 7 | # __date__ = '2016/8/22' 8 | # __Desc__ = 测试文件 9 | 10 | 11 | print '-----s-----------------------------\n' 12 | from xlsx2sql import XlsxTool,Xlsx2sql 13 | tool = XlsxTool() 14 | # table_header_type = ['varchar(100) not null','int(100) ','varchar(255)','varchar(100)'] 15 | table_header_type = ['int(100) not null','varchar(255) ','varchar(255)','varchar(255)','varchar(30)','varchar(30)','varchar(100) not null'] 16 | release = Xlsx2sql(tool) 17 | release.generate(r'./readout.xlsx',table_header_type,"id",r'./readout.sql') --------------------------------------------------------------------------------