转载:qq_37955852

一、实现场景、

import excel files to mysql

author:zxb

工作每个work经常会导入一到几十张不等的excel表,表少可以用navicat import,但是表多了这样效率会非常慢。
小工具实现方式:将excel保存到一个文件夹下,逐个读取文件夹下excel,读取前三行选择一行作为列名,判断每列最大长度,然后建表,批量插入列名后的数据。
最新实验结果:
数据大小:9 cols x 1033854 rows
导表开始时间:2018-02-09 17:13:03.366167
导表结束时间:2018-02-09 17:16:15.192139

二、用到的库

import pymysql #连接mysql数据库
import easygui #GUI界面
import xlrd #读取excel
import os
import re
import datetime

三、预备知识

str.replace(old, new[, max])  把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次

四、初始化类

class Exceltomysql:

# initialize
def __init__(self):
# enterbox() 为用户提供一个最简单的输入框,返回值为用户输入的字符串。
self.db = easygui.enterbox(msg="Enter Database") # 选择插入的数据库
self.conn = pymysql.connect(host="localhost", user='root', passwd='', database=self.db, charset='utf8')
self.cur = self.conn.cursor()
self.path = "" # 初始化文件夹路径
self.column_row = 0 # 初始化列名所在行数

五、主函数

def main(self):
start_time = datetime.datetime.now() # 导入前时间
files = self.getFiles() # 获取需要导入的excel文件列表
for file in files: # 循环导入文件
# 用文件名做表名
table_name = "test_" + file.replace(' ', '_').replace('.xlsx', '').replace('.xls','').replace('.XLSX','')
file = self.path + '\\' + file
col_len, table, nrows, col_names = self.readExcel(file) # 读取excel数据,并返回列名:列长度,表数据,行数,列名
self.createTable(table_name, col_len) # 用表名和列名:列长度建表
self.insertTable(table_name, table, nrows, col_names) # 插入表
end_time = datetime.datetime.now() # 导入完成后时间
print(start_time)
print(end_time)

六、功能函数

    # 返回需要导入的execl文件列表
def getFiles(self):
# 函数用于提供一个对话框,返回用户选择的目录名,该目录名是带有完整的路径的
# 选择Cancel的话,返回值默认为None
self.path = easygui.diropenbox(msg="choose excel files directory"
, title="directory"
, default="E:\python\ExcelToMysql")
print(os.listdir(self.path))
files = os.listdir(self.path)
file_l = []
for file in files:
# os.path.isdir(file)判断是否是目录
if not os.path.isdir(file) and re.fullmatch(r"^[a-zA-Z0-9].*?\.(xls|xlsx|XLSX)$",file):#判断是excel文件才导入
file_l.append(file)
return file_l # read excel
# 返回工作表的:
# 1、每一列的字符串最大长度,存放在字典中
# 2、工作表对象 3、工作表的行数 4、工作表的属性列表
def readExcel(self, file):
data = xlrd.open_workbook(file)
table = data.sheets()[0] # 工作表对象
nrows = table.nrows # 行数
ncols = table.ncols # 列数
msg = "1:" + str(table.row_values(0)) + "\n2:" + str(table.row_values(1)) + "\n3:" + str(table.row_values(2))#显示前三行
idx = int(easygui.enterbox(msg=msg, title="Choose column row number:"))
if idx:
self.column_row = idx
col_names = table.row_values(idx-1) # 属性列表
for i in range(len(col_names)):
col_names[i] = col_names[i].strip() # 清除列名前后空格
col_len = {}
max_len = []
# 获取每一列的字符串最大长度
for i in range(len(col_names)):
cols = table.col_values(i)
col_lens = []
for col in cols:
col_lens.append(len(str(col)))
max_len = max(col_lens)
col_len[cols[0].strip()] = max_len return col_len, table, nrows, col_names # create table
def createTable(self, table_name, col_len):
print(table_name)
sql = "drop table if exists %s" % table_name
self.cur.execute(sql)
self.conn.commit()
sql = "create table %s(" % table_name # 拼接建表sql
for key in col_len:
col_name = key
print(col_name)
max_length = col_len[key]
type = "varchar(255)"
if max_length > 255: # 如果最大长度大于255,改用text类型
type = "text"
sql = sql + "`%s` %s default null,"%(col_name,type) sql = sql[:-1] + ") default charset=utf8"
easygui.msgbox(msg="%s" % sql, title="create table")
self.cur.execute(sql)
self.conn.commit() def insertTable(self, table_name, table, nrows, col_names):
cols = "`,`".join(col_names)
list = [] # 获取所有要插入的行数据
for rownum in range(self.column_row, nrows):
row = table.row_values(rownum)
list.append(row)
l = len(col_names)
v = "%s,"*l # 拼接插表sql
v = v[:-1]
print(v)
sql = "insert into %s(%s) values(" % (table_name, "`"+cols+"`")
sql = sql + "%s)" % v
print(sql)
self.cur.executemany(sql, list) # 批量插入
self.conn.commit()

调用:

run = Exceltomysql()
run.main()

python3实现多excel一键导入mysql的更多相关文章

  1. 将Excel数据导入mysql数据库的几种方法

    将Excel数据导入mysql数据库的几种方法 “我的面试感悟”有奖征文大赛结果揭晓! 前几天需要将Excel表格中的数据导入到mysql数据库中,在网上查了半天,研究了半天,总结出以下几种方法,下面 ...

  2. Excel连接到MySQL,将Excel数据导入MySql,MySQL for Excel,,

    Excel连接到MySQL 即使当今时代我们拥有了类似微软水晶报表之类的强大报表工具和其他一些灵活的客户管 理应用工具,众多企业在分析诸如销售统计和收入信息的时候,微软的Excel依然是最常用的工具. ...

  3. navcat excel数据导入mysql的方法

    navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...

  4. 将Excel数据导入MySql

    1.将选中的数据快儿拷贝到一个TXT文本文件中(记得把后面的空格消掉..),假如存到“D:\data.txt”这个位置里. 2.根据要导入的数据快儿建立MySql数据库和表,然后进入命令提示符里使用命 ...

  5. 如何将EXCEL表导入MYSQL

            在平时的工作学习中,难免会遇到需要把EXCEL表中的数据导入到MYSQL中,比如要把EXCEL中的数据进行核对,或者要把测试用例导入到TestLink中.本人搜集相关的资料并加以实践总 ...

  6. tp3.2.3运用phpexcel将excel文件导入mysql数据库

    1,下载PHPExcel 2,配置将下载好的PHPExcel文件与PHPExcel.php 放到thinkphp 根目录 include/Library/Org/Util/下面 3,同时将PHPExc ...

  7. excel文件导入mysql

    在数据处理的过程中,常常要把windows下的excel文件导入linux下的mysql.这其中会出现一些问题. 1.首先,要在mysql中建表.命令最好存在记事本中,可以随时修改,随时执行 crea ...

  8. 【MySQL笔记】Excel数据导入Mysql数据库的实现方法——Navicat

    很多公司尤其有点年头的公司,财务业务部门的各种表单都是excel来做的表格,随着互联网的发展各种业务流程都电子化流程化了,再在茫茫多的文档中去查找某一个年份月份的报告是件相当枯燥的事,所以都在想办法将 ...

  9. Excel 逐条导入Mysql(数据更新)

    其实,我的业务流程是, 先读取excel/csv -> pandas 数据清洗 -> 导入Mysql, 一般是做一个表append 或者是 if exist -> replace的操 ...

随机推荐

  1. File available()方法

    File类中的length()方法与IO中InputStream类中的available()方法功能重复? 只是返回值类型不同 前者返回long后者返回int   但本质上都一样表示文件的字节数  a ...

  2. Z遮罩层完全覆盖页面

    不要使用absolute定位,用fixed就行.然后 background:rgba(0, 0, 0, 0.5); position:fixed; z-index: 100; left:0; righ ...

  3. Guarding the Chessboard(UVa 11214)

    本题题意: 输入一个n*m的棋盘,某些格子有标记,用最少的皇后占据或者攻击所以带标记的格子.皇后的攻击范围为同行同列和同对角线. 可以使用IDA*算法,即从样例可以发现只需要最多5个棋子就可以对棋盘上 ...

  4. opencv3中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher的使用

    opencv2中SurfFeatureDetector.SurfDescriptorExtractor.BruteForceMatcher在opencv3中发生了改变.具体如何完成特征点匹配呢?示例如 ...

  5. C++学习(二十四)(C语言部分)之 结构体1

    1.结构体 存放多个不同类型的数据 但是是相关联的 数组 存放多个相同类型的数据 结构体是存放多个相关联的不同类型的数组 struct 定义一个结构体类型 自定义类型 2.结构体定义方式 定义类型最通 ...

  6. PS学习之制作音乐视屏

    素材: 新建画布 插入图片素材 调整和画布一样大小 喜欢彩色的 可以加照片滤镜 喜欢黑白的可以加黑白滤镜 也可以添加自己喜欢的文字 在窗口中选择时间轴 创建视屏时间轴 图中标记得就是每秒能播放30张 ...

  7. Python学习手册

    基础 概念 源码编译为字节码,解释器解释字节码 CPython是python标准实现方式,Jython将源码编译为java字节码,运行在JVM上 优点:快速开发,灵活的核心数据类型,优美的缩进语法,垃 ...

  8. Linux命令速查手册

    Others make 通过外部编译器的,比如linux中的gcc集来编译源码 获取Makefile文件的命令触发编译 curl -X GET/POST -I 获取head curl有cache 查看 ...

  9. String、StringBuffer、StringBuidler 知识整理

    String.StringBuffer.StringBuidler.这三个家伙,大家都不陌生,肯定也都会用.三者异同大家都能说出来,但是其根本原因是什么呢?带着下面问题,学习一下. 第一.String ...

  10. ionic1页面间传递参数的问题

    1.  $scope.routeinfo是我要传递的参数--到scheddulcontent这个页面去: $state.go( "scheddulcontent" , { 'rou ...