转载: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. 配置apache-maven-3.6.0时所遇到的坑(二)

    在命令行窗口中输入:mvn  -v    或 直接    mvn    时出现如下问题: The JAVA_HOME environment variable is not defined corre ...

  2. xdoj-1022-A simple math problem 2 // 太强了

    //其实题目中f[n]的值可理解为存在多少个整数对使a*b<=n #include<cstdio> #define N 1007 #define maxn 1000005 using ...

  3. UVALive-6540 Fibonacci Tree

    #include<bits/stdc++.h> using namespace std; int n,m; struct edge { int x; int y; int len; }ed ...

  4. oracle 数据库备份、还原、和使用心得(表丢失、视图丢失的解决办法)

    一.oracle数据备份:exp 关键字     说明(默认值)                  关键字      说明(默认值) --------------------------------- ...

  5. Python基础线程和协程

    线程: 优点:共享内存,IO操作时,创造并发操作 缺点:枪战资源 线程不是越多越好,具体案例具体分析,请求上下文切换耗时 IO密集型适用于线程,IO操作打开文件网络通讯类,不需要占用CPU,只是由CP ...

  6. Unity 5.x Shader and Effects Cookbook(2nd) (Alan Zucconi Kenneth Lammers 著)

    1. Creating Your First Shader 2. Surface Shaders and Texture Mapping 3. Understanding Lighting Model ...

  7. Python基础_私有变量访问限制

    Python内置了一些特殊变量,以前后上下划线标注,同时我们自己要想定义一些变量,不想让外部访问,又该怎么做呢?更多内容请参考:Python学习指南 访问限制 在class内部,可以有属性和方法,而外 ...

  8. java_main

    Java中用户向系统传递参数的三种基本方式 main方法 在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的 ...

  9. node api 之:Error

    Node.js 中运行的应用程序一般会遇到以下四类错误: 标准的 JavaScript 错误: <EvalError> : 当调用 eval() 失败时抛出. <SyntaxErro ...

  10. 手动制作openstack windows镜像

    https://docs.openstack.org/image-guide/windows-image.html 这里以 windows 2008为例: 准备工作: 1准备好windows 2008 ...