一、pymysql结合xlwt写excel文件
'''
xlwt:
只能保存excel2003版本的文件,即后缀只能是xls
最多只支持65536行数据
超过65536会报错:ValueError: row index (65536)not an intin range(65536)
'''
源码示例
import pymysql
import xlwt
import sys
config = {
'host': '127.0.0.1',
'port': 3308,
'user': query',
'password': 'Jc8Lwtmhc',
'database': 'game',
'charset': 'utf8'
}
def execude_sql(sql, args, mysql_config):
# 创建数据库连接
try:
connect_mysql = pymysql.connect(**mysql_config)
except Exception as e:
print('数据库连接失败,请检查*******')
sys.exit(2)
# 创建游标
cursor = connect_mysql.cursor()
# 执行sql
cursor.execute(sql, args)
# 获取sql执行结果
data = cursor.fetchall()
# 获取表字段
fields = cursor.description
# 关闭连接
cursor.close()
connect_mysql.close()
return data, fields
def get_excel(data, fields, file):
# 创建excel工作簿
workbook = xlwt.Workbook()
# 创建工作表 cell_overwrite_ok=True 如果True,则添加的工作表中的单元格在多次写入时不会引发异常。
sheet = workbook.add_sheet('query_results', cell_overwrite_ok=True)
# 先将列头写入到工作表的第一行
for field in range(0, len(fields)):
# 执行写入操作
# cursor.description拿到的是这样的(('id', 3, None, 11, 11, 0, False), ('guild_id', 3, None, 11, 11, 0, False), ('user_id', 3, None, 11, 11, 0, False))
sheet.write(0, field, fields[field][0])
# 写入数据
# 每行循环
for row in range(1, len(data) + 1): # range顾头不顾尾 所以len(data) +1 才能取完data中的值
# 每列循环写入
for col in range(0, len(fields)):
try:
# cursor.fetchall() 拿到的数据是这样的:((4133107, 74294, 692209, 0, 602485, 692209, 2000, 2273, datetime.datetime(2019, 4, 4, 0, 20, 20),)
# row是从1开始的,而row值里的索引从0开始的,所以此处row-1
# 给每一个单元格复制(通过row,col可以定位出单元格位置,如C3)
sheet.write(row, col, u'%s' % data[row - 1][col])
except Exception as e:
print('出错了,请检查*****')
sys.exit(3)
# 将工作簿保存成文件 ******注意:xlwtz只能保存成excel2003版本的文件,也就是只能保存后缀为xls的excel文件
workbook.save(file)
return 200, 'is successed'
if __name__ == '__main__':
sql = 'select * from game.score_log where guild_id=%s and (user_id=%s or target_id= %s) and create_date >= %s and create_date < %s;'
args = (74294, 602485, 602485, '2019-04-04 00:00:00', '2019-04-05 00:00:00')
data, fields = execude_sql(sql, args, config)
if not data:
print('sql结果为空,请确认******')
sys.exit(5)
flag, msg = get_excel(data, fields, 'szn_scoreinfo.xls')
if flag == 200:
print(msg)
else:
print('excel文件保存失败,请检查******')
sys.exit(6)
二、pymysql结合openpyxl写excel文件
'''
openpyxl:
在openpyxl中,主要用到三个概念:Workbooks(工作簿) Sheets(工作表) Cell(单元格)
打开Workbooks,定位到sheet,操作Cell
可以读写excel2003以上版本的文件
'''
代码示例
#!/usr/bin/env python
# -*- coding: utf8 -*-
# author:Fred_Li
import pymysql
import openpyxl
import sys
config = {
'host': '116.62.118.240',
'port': 3308,
'user': 'lck_query',
'password': 'Jc8LwtmhcIOYRHmT',
'database': 'game',
'charset': 'utf8'
}
def execude_sql(sql, args, mysql_config):
# 创建数据库连接
try:
connect_mysql = pymysql.connect(**mysql_config)
except Exception as e:
print('数据库连接失败,请检查*******')
sys.exit(2)
# 创建游标
cursor = connect_mysql.cursor()
# 执行sql
cursor.execute(sql, args)
# 获取sql执行结果
data = cursor.fetchall()
# 获取表字段
fields = cursor.description
# 关闭连接
cursor.close()
connect_mysql.close()
return data, fields
def get_excel(data, fields, file):
# 创建excel工作簿
f = openpyxl.Workbook()
# 创建工作表
# sheet = f.create_sheet('results')
# # 也可以找到活动的sheet页,空的excel表默认的sheet也就叫Sheet,如果要改名字可以直接给title赋值
sheet = f.active
sheet.title = 'results'
# 先将列头写入到工作表的第一行
for field in range(0, len(fields)):
# row指定从哪一行开始写,column是从哪一列开始写
# ******openpyxl 的首行、首列 是 (1,1)而不是(0,0),如果坐标输入含有小于1的值,提示 :Row or column values must be at least 1,即最小值为1
sheet.cell(row=1, column=field + 1).value = fields[field][0]
# 写入数据
# 每行循环
for row in range(0, len(data)):
# 每列循环写入
for col in range(0, len(fields)):
try:
# cursor.fetchall() 拿到的数据是这样的:((4133107, 74294, 692209, 0, 602485, 692209, 2000, 2273, datetime.datetime(2019, 4, 4, 0, 20, 20),)
# row是从第二行开始写的,所以row+2
# 给每一个单元格复制(通过row,col可以定位出单元格位置,如C3)
sheet.cell(row=row + 2, column=col + 1).value = data[row][col]
except Exception as e:
print('出错了,请检查*****')
sys.exit(3)
# 将工作簿保存成文件 ******:openpyxl可以保存excel2007版本的文件,也就是说可以保存xlsx结尾的excel文件
f.save(file)
return 200, 'is successed'
if __name__ == '__main__':
sql = 'select * from game.score_log where guild_id=%s and (user_id=%s or target_id= %s) and create_date >= %s and create_date < %s;'
args = (74294, 602485, 602485, '2019-04-04 00:00:00', '2019-04-05 00:00:00')
data, fields = execude_sql(sql, args, config)
if not data:
print('sql结果为空,请确认******')
sys.exit(5)
flag, msg = get_excel(data, fields, 'szn_scoreinfo.xlsx')
if flag == 200:
print(msg)
else:
print('excel文件保存失败,请检查******')
sys.exit(6)