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 相关文章推荐
Python3.x中自定义比较函数
Apr 24 Python
Python实现的Excel文件读写类
Jul 30 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
matplotlib实现区域颜色填充
Mar 18 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python基于WordCloud制作词云图
Nov 29 Python
pandas中ix的使用详细讲解
Mar 09 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
python 装饰器的基本使用
Jan 13 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面试题附答案
2009/01/07 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
javascript 常用功能总结
2012/03/18 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
js链表操作(实例讲解)
2017/08/29 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
django_orm查询性能优化方法
2018/08/20 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
2014年纠风工作总结
2014/12/08 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript