1. 程式人生 > 資料庫 >python查詢MySQL將資料寫入Excel

python查詢MySQL將資料寫入Excel

一、概述

現有一個使用者表,需要將表資料寫入到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','[email protected]','2020-04-10 01:22:07');
INSERT INTO `test`.`users` (`id`,`create_time`) VALUES ('2','zhang',`create_time`) VALUES ('3','lisi','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,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','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,cell_overwrite_ok=True)

    # 第一行結果
    row0 = result[0]
    # 列欄位
    column_names = list(row0)

    # 寫第一行,也就是列所在的行
    for i in range(0,len(row0)):
      sheet1.write(0,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,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,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',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,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的資料請關注我們其它相關文章!