python xlwt和openpyxl 写excel文件
一、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)
转载请注明出处:http://www.cnblogs.com/lichunke/