Python从数据库取数据到Excel

工具脚本---可以直接使用

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/12/2 21:47
# @Author  : Administrator
# @File    : db_excel.py
import os
import xlwt
import pymysql
import datetime


class MysqlToExcel(object):
    def __init__(self):
        self.host = '127.0.0.1'
        self.user = 'root'
        self.passwd = 'root'
        self.db_name = 'world'
        self.port = 3306
        self.file_name = 'data.xls'

    def get_query_results(self):
        sql = "select * from world.city;"

        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 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)

    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)

        # 第一行结果
        row0 = result[0]
        # 列字段
        column_names = list(row0)

        # 写第一行,也就是列所在的行
        for i in range(0, len(row0)):
            sheet1.write(0, i, 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')

                # 获取表格对象
                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, 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()

 

原文地址:https://www.cnblogs.com/wzhqzm/p/14076738.html