文章目录

  • 背景说明:
  • 前置条件:
  • 硬件环境:
  • 编码过程要点
    • 1. 头部引入
    • 2. excel读取
    • 3. mysql写入
    • 4. 整体代码
  • 总结
  • 参考

背景说明:

基于Jira设计了一套研发的KPI考核的机制,主要采用任务+工时的形式,分为工作量+质量+规范的考核体系。
数据都从Jira导出,经过规则计算后,生成对应的每个人的考核数据和分值。
现在是前期探索,所以可能中间算法或者数据来源都有变更,目前还不适合编码固定算法,所以现在先使用excel的透视表功能。
将基础数据放在A.xlsx,透视表在B.xlsx中,数据源指定到A。这样以后A的基础数据更新后,B直接刷新透视表即可变为最新数据。
现在问题是员工希望了解自己的基础数据,在excel中不太方便查询,所以想要自动导入数据库中,通过BI系统可以让员工自行查看分析基础数据。

前置条件:

Jira和BI都是现有的系统,没有研发人员,基础数据A是由研发助理手动处理的。我设想最简单的方法就是让助理通过web直接上传至服务器,服务器上写一个脚本解析excel并且插入对应的数据表中,BI就可以直接连接数据库提供查询界面了。
shell脚本解析和操作数据库比较困难,所以就把目光放在了python身上。

硬件环境:

  • 操作系统:CentOS 6.5
  • 数据库:Mysql 5.6.41
  • 编程语言:Python 2.7.3 Python 开发者年度调查报告,Python3 采用率超 84% 推荐使用Python3
  • 编码工具:Vim (只是一段很小的脚本,就直接在服务器上用vim编写了,但是linux默认的颜色渲染还是很好的,如图)

编码过程要点

1. 头部引入

import MySQLdb as mdb # mysql
import os
import sys
import re
import xlrd # 读取 excel

引用要产生效果,需要安装对应的包
python提供了很多的外部包调用来解决问题,我们本次的重点是excel 和myslq 所以需要引用 MySQLdb 和 xlrd,在系统命令行执行以下命令即可:

pip install MySQL-python
pip install xlrd

这样就安装了mysql和excel的支持

2. excel读取

wb = xlrd.open_workbook('%s%s' %(filepath,excel.split(',')[0]))
s01 = wb.sheet_by_name('S01-本月workpoint原始数据'.decode('utf-8'))
s02 = wb.sheet_by_name('S02-上月跨本月工时原始数据'.decode('utf-8'))
s03 = wb.sheet_by_name('S03-本月跨下月工时原始数据'.decode('utf-8'))
s04 = wb.sheet_by_name('S04-在线问题工时原始数据'.decode('utf-8'))

一行代码 xlrd.open_workbook 就直接打开了excel ,wb.sheet_by_name就直接将行列数据读取为数组,完全没有废话。

3. mysql写入

mysql的操作比较常规,主要分为两大块,连接mdb.connect(),游标connect.cursor()
connect负责建立连接通道,cursor负责具体操作执行

# 建立连接
conn = mdb.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='dbname', charset='utf8')# 使用cursor()方法获取操作游标
cursor = conn.cursor()# 执行插入语句
sSql = 'insert into z_kpi_s01 (k_month,col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10,col_11,col_12) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
cursor.executemany(sSql,values)

4. 整体代码

整体代码中还使用到了:

  • for循环
  • if判断
  • 正则判断
  • 打印带参数文字
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import os
import sys
import re
import xlrdconn = mdb.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='dbname', charset='utf8')# 使用cursor()方法获取操作游标
cursor = conn.cursor()
# 因该模块底层其实是调用CAPI的,所以,需要先得到当前指向数据库的指针。try:# 读取Excel文件,并且确认是否需要导入needImportXlsx = []filepath = '/data/'pathDir = os.listdir(filepath)print 'list size is : %s' % len(pathDir)for allDir in pathDir:fnCount = cursor.execute('select filename from fileattachment where id=%s' % allDir)filename = cursor.fetchone()[0]canMatch = re.match(r'\d{6}', filename)if not (canMatch):continuetmpCount = cursor.execute('select * from z_kpi_s01 where k_month=%s' % filename)print '%s tmp count is : %s ' % (filename, tmpCount)if tmpCount == 0:needImportXlsx.append(allDir + ',' + filename)if len(needImportXlsx) == 0:print '!!!no file need import!!!'sys.exit()print 'all need import xlsx are : %s ' % needImportXlsxfor excel in needImportXlsx:wb = xlrd.open_workbook('%s%s' % (filepath, excel.split(',')[0]))s01 = wb.sheet_by_name('S01-本月workpoint原始数据'.decode('utf-8'))s02 = wb.sheet_by_name('S02-上月跨本月工时原始数据'.decode('utf-8'))print 's01 has col %d row %d \n s02 has col %d row %d ' % (s01.ncols, s01.nrows, s02.ncols, s02.nrows)# s01 insert mysqlvalues = []for i in range(s01.nrows):if i == 0:continuevalue = s01.row_values(i)[:12]value.insert(0, excel.split(',')[1])values.append(value)sSql = 'insert into z_kpi_s01 (k_month,col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10,col_11,col_12) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'cursor.executemany(sSql, values)# s02 insert mysqlvalues = []for i in range(s02.nrows):if i == 0:continuevalue = s02.row_values(i)[:31]value.insert(0, excel.split(',')[1])values.append(value)sSql = 'insert into z_kpi_s02 (k_month,col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10,col_11,col_12,col_13,col_14,col_15,col_16,col_17,col_18,col_19,col_20,col_21,col_22,col_23,col_24,col_25,col_26,col_27,col_28,col_29,col_30,col_31) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'cursor.executemany(sSql, values)# 如果没有设置自动提交事务,则这里需要手动提交一次conn.commit()
except:import tracebacktraceback.print_exc()# 发生错误时会滚conn.rollback()
finally:# 关闭游标连接cursor.close()# 关闭数据库连接conn.close()

总结

在这个之前还从来没有写过Python,写整体代码大概花了2个小时左右,其他时间花在服务器上面的安装和一些权限上。整体感觉Python的优势很明显,作为一种粘合代码,执行一些Shell脚本比较难实现的功能,是非常方便的。语法也很简单,但是对于我这样的Java开发者有时候习惯性的 {} 和 ; 反而是错误

参考

主要参考了这两篇文章:
Python连接MySQL数据库
python脚本实现excel和mysql数据库表的导入导出

python入门学习(excel导入mysql)相关推荐

  1. python 入门学习---模块导入三种方式及中文注释

    Python 有三种模块导入函数 1. 使用import 导入模块 import modname : 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了一个模块,就可以引用 ...

  2. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  3. 自学python推荐书籍2019-2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  4. python入门视频教程推荐-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

  5. 字字谏言!Python入门学习教程:关于Python不得不说的事儿

    作为程序员,你肯定遇到过这样的领导: "别人还没走,你先走了不合适吧." "不能确定功劳,总得有苦劳吧!你看别人9点谁走了?" 说到996,这很有可能是诱因之一 ...

  6. Python入门学习---第四天

    面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...

  7. Python入门学习之异常处理机制

    异常即是一个事件,该事件会在程序执行过程中发生影响程序的正常执行.python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.今天的Python入门学习课程就给大家讲解一下异常 ...

  8. python入门学习:4.if语句

    python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试   if语句基本格式如下,注意不要漏了冒号 1if 条件 :2 执行1 ...

  9. mysql 导入日期 0000_解决Excel导入MySQL日期为0000-00-00

    最近在为客户做一个库存升级改造的项目,之前客户的数据管理全部是在Excel中操作,估计以前也是没有意识到数据量变大以后,工作会变得如此困难,基本上处于一个无法操作的程度了.于是我们将旧版本的Excel ...

最新文章

  1. 十五天精通WCF——第八天 对“绑定”的最后一点理解
  2. python中matrix函数_使用python解线性矩阵方程(numpy中的matrix类)
  3. HDU2041超级楼梯
  4. 使用lucene3.6创建索引和实现简单搜索
  5. CSDN 创始人蒋涛:拥抱中国开源技术生态发展黄金十年
  6. LeetCode--057--插入区间(java)
  7. VS2010/VS2012/VS2015下openGL环境配置(转)
  8. 01-移植AZPR SoC到Xilinx Aritix7 FPGA
  9. 阮一峰ES6入门学习笔记~~变量的解构赋值
  10. 电子邮件群发工资条的方法
  11. 常见文件文件头文件尾格式总结及各类文件头
  12. 怎样的工作量评估更合理?
  13. RS232电平与TTL电平转换
  14. 网站自动SEO优化软件
  15. [IOS APP]西藏生死书
  16. 《被讨厌的勇气》书摘心得之一切烦恼都来自人际关系(2)
  17. Tomcat(4)-集群
  18. 搭建SRS直播服务器
  19. cdr轮廓字怎么把轮廓拆出来_用corelDraw怎么把文字做成轮廓?
  20. Python 自动识别图片文字—OCR实战教程

热门文章

  1. virtualBox上Ubuntu的网络设置(万能方法)
  2. 鸿蒙之下分城如果建设,率土之滨:分城数量不再限制,戍城、金虎台、拜将台让战斗更激烈...
  3. A Guide To Reverse Tethering
  4. Unity 相机被遮挡的判断与处理
  5. 7_文件系统与磁盘分区
  6. docker容器内开启22 ssh_细述docker容器中创建SSH服务镜像
  7. 2020年ICPC辽宁省赛- 最长回文串(Java)
  8. 简历模板,简历通用模板,程序员求职简历模板
  9. php predis连接超时,如何解决redis连接超时问题
  10. 5w月薪想挖一个阿里p7程序员?网友:降薪过去不大可能