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)
原文地址:https://www.cnblogs.com/lichunke/p/10677174.html