开发插件需要实现功能:用户选择一个excel文件,后台将该excle文件转换为sql语句(.sql)文件,执行该文件进而在sql数据库中创建该excle表中的数据。
本文实现部分:将该excle文件转换为sql语句(.sql)文件
python和sql都为初学,以下代码琢磨了一个晚上,可能仍有语句繁琐,或者用其他简单方法可替代的地方
import xlrd # 这两个库没有的可以 pip install 安装一下
import xlwt
【补充】
如果直接pip install xlrd,在后续使用该函数时可能会报错:
xlrd.biffh.XLRDError: Excel xlsx file; not supported
解决办法参考博客:https://blog.youkuaiyun.com/weixin_44073728/article/details/111054157
# 创建转换函数,输入参数:excle文件名,sql文件名,创建的sql表名
def excel_to_sql(excelfilename,sqlfilename,table_name):
excelfilename = excelfilename
sqlfilename = sqlfilename
table_name = table_name
data = xlrd.open_workbook(excelfilename)
sheet_data = data.sheet_by_name('Sheet1')
file = open(sqlfilename,mode = 'w+') # 创建sql文件
colNum = sheet_data.ncols # 列数
num = sheet_data.nrows # 行数
d_type = ['VARCHAR(20)', 'VARCHAR(20)', 'VARCHAR(20)','VARCHAR(20)'] # 后期开发拟通过用户输入获取
(1)创建sql中创建表(CREATE TABLE)部分
# ------- 创建表 ----------
sql_c = '''create table {} (\n'''.format(table_name)
header = sheet_data.row_values(0)
for i in range(colNum):
if i< colNum-1: # 为了实现最后一行不加逗号的效果
sql_c = sql_c + header[i] + ' ' + d_type[i] +',\n'
else:
sql_c = sql_c + header[i] + ' ' + d_type[i] + '\n);'
print('sql_c = ', sql_c)
以上运行结果符合sql语句要求
(2)创建sql中插入表数据(INSERT INTO)部分
# ------- 插入数据 ---------
row_data =''
for j in range(1,num):
row_list = sheet_data.row_values(j) # 表中每一行的数据
row_v = str(row_list)
# print('row_v= ', row_v,type(row_v))
row_v = row_v[1:-1]
# row_v[-1] = ')'
# print('row_v= ', row_v)
row_da = '(' + row_v + ')'
if j < num-1:
row_data = row_data + row_da + ','
else:
row_data = row_data + row_da + ';'
# print('row_data = ', row_data)
sql_insert = '''insert into {} \n Values {}'''.format(table_name,row_data) #插入命令
print('sql_insert = ', sql_insert)
结果符合sql语句要求
最后把两部分连接起来,并写入.sql文件即完成
sql_all = sql_c + '\n' +sql_insert
print(sql_all)
file.write(sql_all)
file.close()
print("sucess !")
if __name__ == '__main__':
excel_to_sql('a.xlsx','a.sql','test_data')
print结果:
最后在SQLyog中可以成功运行,但数据类型的显示仍有有待进一步修改,总体算实现了所需要的效果
参考了以下博客中的部分内容:https://blog.youkuaiyun.com/jeanette_zlj/article/details/106079344