python查询MySQL将数据写入Excel


Posted in Python onOctober 29, 2020

一、概述

现有一个用户表,需要将表数据写入到excel中。

环境说明

mysql版本:5.7

端口:3306

数据库:test

表名:users

表结构如下:

CREATE TABLE `users` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `username` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
 `password` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '密码',
 `phone` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '手机号',
 `email` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '邮箱',
 `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

插入3行数据

INSERT INTO `test`.`users` (`id`, `username`, `password`, `phone`, `email`, `create_time`) VALUES ('1', 'xiao', '123', '12345678910', '123@qq.com', '2020-04-10 01:22:07');
INSERT INTO `test`.`users` (`id`, `username`, `password`, `phone`, `email`, `create_time`) VALUES ('2', 'zhang', '123', '12345678910', '123@qq.com', '2020-04-10 01:22:07');
INSERT INTO `test`.`users` (`id`, `username`, `password`, `phone`, `email`, `create_time`) VALUES ('3', 'lisi', '123', '12345678910', '123@qq.com', '2020-04-10 01:22:07');

二、基本写法

安装模块

pip3 install xlwt pymysql

test_excel.py

#!/usr/bin/env python3
# coding: utf-8
import os
import xlwt
import pymysql
import datetime

class MysqlToExcel(object):
  def __init__(self):
    self.host = '10.212.21.92'
    self.user = 'root'
    self.passwd = 'abcd1234'
    self.db_name = 'test'
    self.port = 3306
    self.file_name = 'data.xls'

  def get_query_results(self):
    sql = "select * from test.users"

    conn = pymysql.connect(
      host=self.host,
      user=self.user,
      passwd=self.passwd,
      port=self.port,
      database=self.db_name,
      charset='utf8',
      cursorclass=pymysql.cursors.DictCursor
    )
    cur = conn.cursor() # 创建游标
    cur.execute(sql) # 执行sql命令
    result = cur.fetchall() # 获取执行的返回结果
    # print(result)
    cur.close()
    conn.close() # 关闭mysql 连接
    return result

  def generate_table(self):
    """
    生成excel表格
    :return:
    """
    # 删除已存在的文件
    if os.path.exists(self.file_name):
      os.remove(self.file_name)

    result = self.get_query_results()
    # print(result)
    if not result:
      print("查询结果为空")
      return False

    # 创建excel对象
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('Sheet1', cell_overwrite_ok=True)

    # 列字段
    column_names = ['id','username','password','phone','email']

    # 写第一行,也就是列所在的行
    for i in range(0, len(column_names)):
      sheet1.write(0, i, column_names[i])

    # 写入多行
    num = 0 # 计数器
    for i in result:
      sheet1.write(num + 1, 0, i['id'])
      sheet1.write(num + 1, 1, i['username'])
      sheet1.write(num + 1, 2, i['password'])
      sheet1.write(num + 1, 3, i['phone'])
      sheet1.write(num + 1, 4, i['email'])
      # 日期转换为字符串
      value = i['create_time'].strftime('%Y-%m-%d %H:%M:%S')
      sheet1.write(num + 1, 5, value)

      num += 1 # 自增1

    # 保存文件
    f.save(self.file_name)

    # 判断文件是否存在
    if not os.path.exists(self.file_name):
      print("生成excel失败")
      return False

    print("生成excel成功")
    return True

if __name__ == '__main__':
  MysqlToExcel().generate_table()

执行输出:

查看excel表

python查询MySQL将数据写入Excel

三、高级写法

在基础写法中,需要指定表的字段,比如:['id','username','password','phone','email']

如果一个表有70个字段怎么办?一个写笔记耗时间,能不能动态获取表字段呢?答案是可以的。

由于我在创建游标时,指定了pymysql.cursors.DictCursor,它返回的每一行数据,都是一个字典。

因此,通过dict.keys()就可以获取表字段了。

另外,我还得将查询结构中非string的转换为string类型。

test_excel.py

#!/usr/bin/env python3
# coding: utf-8
import os
import xlwt
import pymysql
import datetime

class MysqlToExcel(object):
  def __init__(self):
    self.host = '10.212.21.92'
    self.user = 'root'
    self.passwd = 'abcd1234'
    self.db_name = 'test'
    self.port = 3306
    self.file_name = 'data.xls'

  def get_query_results(self):
    sql = "select * from test.users"

    conn = pymysql.connect(
      host=self.host,
      user=self.user,
      passwd=self.passwd,
      port=self.port,
      database=self.db_name,
      charset='utf8',
      cursorclass=pymysql.cursors.DictCursor
    )
    cur = conn.cursor() # 创建游标
    cur.execute(sql) # 执行sql命令
    result = cur.fetchall() # 获取执行的返回结果
    # print(result)
    cur.close()
    conn.close() # 关闭mysql 连接
    return result

  def generate_table(self):
    """
    生成excel表格
    :return:
    """
    # 删除已存在的文件
    if os.path.exists(self.file_name):
      os.remove(self.file_name)

    result = self.get_query_results()
    # print(result)
    if not result:
      print("查询结果为空")
      return False

    # 创建excel对象
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('Sheet1', cell_overwrite_ok=True)

    # 第一行结果
    row0 = result[0]
    # 列字段
    column_names = list(row0)

    # 写第一行,也就是列所在的行
    for i in range(0, len(row0)):
      sheet1.write(0, i, column_names[i])

    # 写入多行
    # 行坐标,从第2行开始,也是1
    for row_id in range(1, len(result) + 1):
      # 列坐标
      for col_id in range(len(column_names)):
        # 写入的值
        value = result[row_id - 1][column_names[col_id]]
        # 判断为日期时
        if isinstance(value, datetime.datetime):
          value = result[row_id - 1][column_names[col_id]].strftime('%Y-%m-%d %H:%M:%S')

        # 写入表格
        sheet1.write(row_id, col_id, value)

    # 保存文件
    f.save(self.file_name)

    # 判断文件是否存在
    if not os.path.exists(self.file_name):
      print("生成excel失败")
      return False

    print("生成excel成功")
    return True

if __name__ == '__main__':
  MysqlToExcel().generate_table()

执行脚本,结果同上!

四、自适应宽度

上面表格看着不美观,宽度没有自适应。

解决方法:

增加一个方法,获取宽度

def get_maxlength(self,value, col):
  """
  获取value最大占位长度,用于确定导出的xlsx文件的列宽
  col : 表头,也参与比较,解决有时候表头过长的问题
  """
  # 长度列表
  len_list = []
  # 表头长度
  width = 256 * (len(col) + 1)
  len_list.append(width)

  # 数据长度
  if len(value) >= 10:
    width = 256 * (len(value) + 1)
    len_list.append(width)

  return max(len_list)

完整代码如下:

#!/usr/bin/env python3
# coding: utf-8
import os
import xlwt
import pymysql
import datetime

class MysqlToExcel(object):
  def __init__(self):
    self.host = '10.212.21.92'
    self.user = 'root'
    self.passwd = 'abcd1234'
    self.db_name = 'test'
    self.port = 3306
    self.file_name = 'data.xls'

  def get_query_results(self):
    sql = "select * from test.users"

    conn = pymysql.connect(
      host=self.host,
      user=self.user,
      passwd=self.passwd,
      port=self.port,
      database=self.db_name,
      charset='utf8',
      cursorclass=pymysql.cursors.DictCursor
    )
    cur = conn.cursor() # 创建游标
    cur.execute(sql) # 执行sql命令
    result = cur.fetchall() # 获取执行的返回结果
    # print(result)
    cur.close()
    conn.close() # 关闭mysql 连接
    return result

  def get_maxlength(self,value, col):
    """
    获取value最大占位长度,用于确定导出的xlsx文件的列宽
    col : 表头,也参与比较,解决有时候表头过长的问题
    """
    # 长度列表
    len_list = []
    # 表头长度
    width = 256 * (len(col) + 1)
    len_list.append(width)

    # 数据长度
    if len(value) >= 10:
      width = 256 * (len(value) + 1)
      len_list.append(width)

    return max(len_list)


  def generate_table(self):
    """
    生成excel表格
    :return:
    """
    # 删除已存在的文件
    if os.path.exists(self.file_name):
      os.remove(self.file_name)

    result = self.get_query_results()
    # print(result)
    if not result:
      print("查询结果为空")
      return False

    # 创建excel对象
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('Sheet1', cell_overwrite_ok=True)

    # 第一行结果
    row0 = result[0]
    # 列字段
    column_names = list(row0)

    # 写第一行,也就是列所在的行
    for i in range(0, len(row0)):
      sheet1.write(0, i, column_names[i])

    # 写入多行
    # 行坐标,从第2行开始,也是1
    for row_id in range(1, len(result) + 1):
      # 列坐标
      for col_id in range(len(column_names)):
        # 写入的值
        value = result[row_id - 1][column_names[col_id]]
        # 判断为日期时
        if isinstance(value, datetime.datetime):
          value = result[row_id - 1][column_names[col_id]].strftime('%Y-%m-%d %H:%M:%S')

        # 获取表格对象
        col = sheet1.col(col_id)
        if value:
          if isinstance(value, int):
            value = str(value)

          # 获取宽度
          width = self.get_maxlength(value,column_names[col_id])

          # 设置宽度
          col.width = width
        # 写入表格
        sheet1.write(row_id, col_id, value)

    # 保存文件
    f.save(self.file_name)

    # 判断文件是否存在
    if not os.path.exists(self.file_name):
      print("生成excel失败")
      return False

    print("生成excel成功")
    return True

if __name__ == '__main__':
  MysqlToExcel().generate_table()

执行脚本,查看excel

 python查询MySQL将数据写入Excel

以上就是python查询MySQL将数据写入Excel的详细内容,更多关于python 查询MySQL的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python检查字符串是否是正确ISBN的方法
Jul 11 Python
Python解析最简单的验证码
Jan 07 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
对numpy中轴与维度的理解
Apr 18 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
pycharm导入源码的具体步骤
Aug 04 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
Python 使用office365邮箱的示例
Oct 29 #Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 #Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 #Python
15个Pythonic的代码示例(值得收藏)
Oct 29 #Python
python 如何设置守护进程
Oct 29 #Python
python 多线程中join()的作用
Oct 29 #Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 #Python
You might like
php采集速度探究总结(原创)
2008/04/18 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php curl常用的5个经典例子
2017/01/20 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
js运动事件函数详解
2016/10/21 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
node内置调试方法总结
2018/02/22 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
js数据类型检测总结
2018/08/05 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
JS实现小米轮播图
2020/09/21 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
利用python画一颗心的方法示例
2017/01/31 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
兼职业务员岗位职责
2014/01/01 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang