zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    jQuery Querystring
    BCP 导出文本到文件
    ASP.NET MVC实践系列12表单处理(转)
    with(nolock) 解释 SQL
    DevServer
    静态语言、动态语言、强类型语言、弱类型语言
    @符号惹的祸
    洛谷 题解 P4198 【楼房重建】
    题解 P2668 【斗地主】
    题解 P3620 【[APIO/CTSC 2007]数据备份】
  • 原文地址:https://www.cnblogs.com/lichunke/p/10677174.html
Copyright © 2011-2022 走看看