![e8bca9ac10d340ec34efc980ca9ebe0b.png](https://i-blog.csdnimg.cn/blog_migrate/a099ab7dfd29b9238a0ce3d72e4ad25a.jpeg)
本文环境配置:
系统=>windows10:64位
工具=>PyCharm:2018.3.1
语言=>Python:3.7.1
第三方库
PyQT5:5.11.3
pyqt5-tools:5.11.3.1.4
PyMySQL:0.9.3
openpyxl:2.5.12
练手:制作一个数据库导入窗口
Qt Designer设计界面
![53553b172fc7bf3a9018022062678e3b.png](https://i-blog.csdnimg.cn/blog_migrate/6642f7e68478742167d896d341e8d953.jpeg)
控件元素:
3个QLabel:第一个label在最下方,用于显示执行的时间,其余两个为标签
1个QLineEdit:显示文件的路径地址
1个QListWidget:显示打开的工作簿中所有的工作表名
2两个QPushButton:执行按钮
信号与槽:
"打开" 按钮对应槽函数:open()
"导入"按钮对应槽函数:to_mysql()
工作表名列集合对应的槽函数:set_tobtn()
编写代码
将.ui
文件转换成.py
文件,然后新建一个业务逻辑文件,把界面文件import
导入
![8c51d1bde72f5ecd7ce60d5857189f26.png](https://i-blog.csdnimg.cn/blog_migrate/dfe697418bd685b4286cab5315b48f55.jpeg)
![ec7cf016aff835a8973dfc4b69ca2e73.png](https://i-blog.csdnimg.cn/blog_migrate/eb810caa454c732e708574d544498acf.jpeg)
open函数:
![e5c6aaf575ac2d0ecec9cb31c1765179.png](https://i-blog.csdnimg.cn/blog_migrate/6eec6f7a4864358aa0998d772435ca06.jpeg)
初始化"导入"按钮不可用,清空表名列集合
self.pushButton_2.setEnabled(False)
self.listWidget.clear()
调出选择文件对话框,可以默认打开的路径,以及筛选文件后缀
将选择的文件完整路径显示在lineEdit
文本框中
filename, _ = QFileDialog.getOpenFileName(self,
'选择文件',
'G:projectExcel_to_MySQL',
'Excel files(*.xlsx , *.xls)')
self.lineEdit_2.setText(filename)
用第三方库openpyxl
打开选择的工作簿,采用只读模式read_only=True
self.wb.sheetnames
获取打开工作簿的所有工作表,然后添加到listWidget
self.wb = openpyxl.load_workbook(filename, read_only=True)
self.sheets = self.wb.sheetnames
self.listWidget.addItems(self.sheets)
set_tobtn函数:
![3a7ed38a2347cb243bfa12b6224fa52c.png](https://i-blog.csdnimg.cn/blog_migrate/1125b378c19e85607e168692bbd789af.jpeg)
默认"导入"按钮不能点击,当表名列集合被点击了,就执行set_tobtn函数,然后将"导入"按钮设置为可用。
to_mysql函数:
![0747a30947bbfe232253f950bc5b7d22.png](https://i-blog.csdnimg.cn/blog_migrate/7ba00005de4526d47e4b913a1ecc4e9e.jpeg)
用pymysql
链接数据库
![e1cc962af77d58c6fbede63119296fca.png](https://i-blog.csdnimg.cn/blog_migrate/a4921dfc29d2a36a9e1ef08e923476c3.jpeg)
打开选中的表self.wb[表名]
,表名根据选中listWidget
返回self.listWidget.currentItem().text()
sheet = self.wb[self.listWidget.currentItem().text()] # 打开选中的表
sheet.max_row
:返回最大行数
sheet.max_column
:返回最大列数
executemany(templet,args)
能同时执行多条语句,执行同样多的语句可比execute()快很多,强烈建议执行多条语句时使用executemany
templet : sql模板字符串,
例如 'insert into table(id,name) values(%s,%s)'
args: 模板字符串的参数,是一个列表,列表中的每一个元素必须是元组!!!
例如: [(1,'小明'),(2,'zeke'),(3,'琦琦'),(4,'韩梅梅')]
最终完成效果,其实SQL执行才0.11秒,然而前面的循环用了12秒。不到300的数据啊
![270ac36dcdcc00a12dfb598b26396da6.png](https://i-blog.csdnimg.cn/blog_migrate/49f1bf1f03fb578988cf107abe77188e.jpeg)
这一坨代码速度好慢,有待优化,望大神指教:
![1d6f1dce272ab27b9545dfa2d9c0e702.png](https://i-blog.csdnimg.cn/blog_migrate/253fb0b5e54d21ead5a755f9f7b77c3c.jpeg)