python 記一次將數據庫查詢結果寫入到表格經歷

python 記一次將數據庫查詢結果寫入到表格經歷python



說明:mysql

    運營那邊提了一些需求,在開發尚未在頁面上實現此功能前,天天早上都要咱們查詢sql語句作成表格,而後發給他們,感受好煩啊,就用python寫了一個腳本,實現此功能
sql



第一次嘗試:數據庫

#!/usr/bin/env python
#encoding=UTF-8

import MySQLdb
import xlwt    #excel write

hostIp = '10.10.94.157'
user = 'xxxx'
passwd = 'xxxx'
database = 'xxxx'

def chongZhiWeiTouZi():                     #充值未投資用戶
    sql = '''SELECT
ctci.acc_no AS '帳號',
ctci.cn_name AS '姓名',
ctci.job_phone AS '手機',
ctci.create_date AS '註冊時間',
        tta.amount AS '充值金額',
        tta.create_time AS '充值時間'
FROM
        TPP_T_ACCOUNT_DEAL tta,CRM_T_CUSTOMER_INFO ctci
WHERE
        tta.customer_id = ctci.id AND 
        tta.type = 1
AND tta.order_status IN (1, 9)
AND tta.customer_id NOT IN (
SELECT DISTINCT customer_id FROM J_P2P_ORDER WHERE order_type = 1 and product_id !=1
)'''

    columnName = ['帳號','姓名','手機','註冊時間','充值金額','充值時間']  #定義全部的列名,共6列

    style1= xlwt.XFStyle()                   #設置單元格格式
    style1.num_format_str= 'yyyy/m/d h:mm:ss'

    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet
    for i in range(len(columnName)):         #將列名插入表格,共6列
        sheet.write(0,i,columnName[i])

    db = MySQLdb.connect(hostIp,user,passwd,database,charset="utf8")         #鏈接數據庫,編碼utf-8
    cursor = db.cursor()                     #建立一個指針對象
    cursor.execute(sql)                      #執行sql語句
    results = cursor.fetchall()

    rows = len(results)                      #獲取行數

    for i in range(rows):
        for j in range(3):
            sheet.write(i+1,j,results[i][j])
        sheet.write(i+1,3,results[i][3],style1)         #設置時間列的單元格格式
        sheet.write(i+1,4,results[i][4])
        sheet.write(i+1,5,results[i][5],style1)

    wb.save('員工信息表.xls')                 #保存表格,並命名爲 員工信息表.xls
    cursor.close()
    db.close()


def yongHuDengLu():                         #用戶登陸信息
    sql = '''SELECT
        login_type AS '來源',
        cn_name AS '登陸名',
        login_addr AS '登陸IP',
        mobile AS '手機號',
        area AS '登陸地區',
        mome AS '手機運營商',
        login_time AS '登陸時間'
FROM
        SYS_T_LOGIN_LOGGER 
ORDER BY login_time DESC'''
    columnName = ['來源','登陸名','登陸IP','手機號','登陸地區','手機運營商','登陸時間']  #定義全部的列名

    style1= xlwt.XFStyle()                   #設置單元格格式
    style1.num_format_str= 'yyyy/m/d h:mm:ss'

    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet
    for i in range(len(columnName)):         #將列名插入表格
        sheet.write(0,i,columnName[i])

    db = MySQLdb.connect(hostIp,user,passwd,database,charset="utf8")
    cursor = db.cursor()                     #建立一個指針對象
    cursor.execute('use J_P2P')
    cursor.execute(sql)                      #執行sql語句
    results = cursor.fetchall()

    rows = len(results)                      #獲取行數

    for i in range(rows):
        for j in range(6):
            sheet.write(i+1,j,results[i][j])
        sheet.write(i+1,6,results[i][6],style1)         #設置時間列的單元格格式

    wb.save('用戶登陸信息.xls')                #保存表格
    cursor.close()
    db.close()

chongZhiWeiTouZi()
yongHuDengLu()

分析:vim

    由於有多個sql查詢語句,而後製做成多個表格,因此寫了多個函數,將每一個sql語句分別寫到每一個函數裏bash

    並且表格的列名也是須要手動輸入的,感受好麻煩,並且好傻瓜
app





第二次嘗試:ide

#!/usr/bin/env python
#encoding=UTF-8

import MySQLdb
import xlwt    #excel write

hostIp = '10.10.94.157'
user = 'xxx'
passwd = 'xxxx'
database = 'xxxxx'

f = open('select.sql','r')
reSql = f.read().split(';')                  #將全部的sql語句賦值給reSql; select.sql文件裏的sql語句要以';'結尾
f.close()

def chongZhiWeiTouZi():                      #充值未投資用戶
    style1= xlwt.XFStyle()                   #設置單元格格式
    style1.num_format_str= 'yyyy/m/d h:mm:ss'

    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet

    db = MySQLdb.connect(hostIp,user,passwd,database,charset="utf8")         #鏈接數據庫,編碼utf-8
    cursor = db.cursor(cursorclass = MySQLdb.cursors.DictCursor)             #建立一個指針對象
    cursor.execute(reSql[0])                 #執行sql語句
    results = cursor.fetchall()

    columnName = []
    for i in results[0].keys():
        columnName.append(i)

    columnLen = len(columnName)
    for i in range(columnLen):               #將列名插入表格,共6列
        sheet.write(0,i,columnName[i])

    rows = len(results)                      #獲取行數

    for i in range(rows):
        for j in range(columnLen):
            sheet.write(i+1,j,results[i][columnName[j]])

    wb.save('員工信息表.xls')                #保存表格,並命名爲 員工信息表.xls
    cursor.close()
    db.close()

def yongHuDengLu():          #用戶登陸信息
    style1= xlwt.XFStyle()                   #設置單元格格式
    style1.num_format_str= 'yyyy/m/d h:mm:ss'

    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet

    db = MySQLdb.connect(hostIp,user,passwd,database,charset="utf8")         #鏈接數據庫,編碼utf-8
    cursor = db.cursor(cursorclass = MySQLdb.cursors.DictCursor)             #建立一個指針對象
    cursor.execute(reSql[1])                 #執行sql語句
    results = cursor.fetchall()

    columnName = []
    for i in results[0].keys():
        columnName.append(i)

    columnLen = len(columnName)
    for i in range(columnLen):               #將列名插入表格,共6列
        sheet.write(0,i,columnName[i])

    rows = len(results)                      #獲取行數

    for i in range(rows):
        for j in range(columnLen):
            sheet.write(i+1,j,results[i][columnName[j]])

    wb.save('用戶登陸信息.xls')               #保存表格,並命名爲 員工信息表.xls
    cursor.close()
    db.close()
chongZhiWeiTouZi()
yongHuDengLu()

分析:函數

    此次把須要查詢的sql語句所有寫到一個文件裏,注意:每一個sql語句要以‘;’結尾
字體

vim select.sql

SELECT
ctci.acc_no AS '帳號',
ctci.cn_name AS '姓名',
ctci.job_phone AS '手機',
ctci.create_date AS '註冊時間',
        tta.amount AS '充值金額',
        tta.create_time AS '充值時間'
FROM
        TPP_T_ACCOUNT_DEAL tta,CRM_T_CUSTOMER_INFO ctci
WHERE
        tta.customer_id = ctci.id AND
        tta.type = 1
AND tta.order_status IN (1, 9)
AND tta.customer_id NOT IN (
SELECT DISTINCT customer_id FROM J_P2P_ORDER WHERE order_type = 1 and product_id !=1
);

select a.acc_no as '用戶名',a.cn_name as '姓名',a.mobile as '銀行預留手機',a.job_phone as '登陸手機',b.order_amount as '投資金額',
c.name as '產品' ,b.lucky_numbers as '幸運號'
from ACTIVITY_LUCKY_NUMBER b left join CRM_T_CUSTOMER_INFO a on b.customer_id = a.id
left join J_P2P_PRODUCT c on b.product_id = c.id
where  b.period='4';

    並且表格的列名會本身從查詢結果裏獲取,再也不手動輸入

    不過,感受仍是很亂,很複雜,並且依然用了多個函數,並且最終的表格格式還很差看,以下:

wKioL1aM2JKBuUfTAAAmuoX_Fs8171.png





第三次嘗試:

    此次沒有再用MySQLdb模塊

#!/usr/bin/env python
#encoding=UTF-8

import os
import xlwt    #excel write

hostIp = '10.10.94.157'
user = 'xxxx'
passwd = 'xxxx'
db = 'xxxx'

f = open('select.sql','r')
reSql = f.read().split(';')                  #將全部的sql語句賦值給reSql; select.sql文件裏的sql語句要以';'結尾
f.close()

def createTable(selectSql,tableName): 
    results = os.popen('mysql -h'+hostIp+' -u'+user+' -p'+passwd+' -D'+db+' -e "'+selectSql+'"').read().strip().split('\n')
    columnName = results[0].split('\t')


    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet

    rows = len(results)                      #獲取行數
    columns = len(columnName)

    for i in range(rows):
        for j in range(columns):
            sheet.write(i,j,results[i].split('\t')[j])

    wb.save(tableName)                       #保存表格
    
createTable(reSql[0],'充值未投資用戶.xls')
createTable(reSql[1],'活動投資名單.xls')

分析:

    此次感受還不錯,只寫了一個函數,語句看上去沒有那麼複雜

    全部的sql語句一樣寫到select.sql文件裏,且以‘;’結尾

vim select.sql

SELECT
ctci.acc_no AS '帳號',
ctci.cn_name AS '姓名',
ctci.job_phone AS '手機',
ctci.create_date AS '註冊時間',
        tta.amount AS '充值金額',
        tta.create_time AS '充值時間'
FROM
        TPP_T_ACCOUNT_DEAL tta,CRM_T_CUSTOMER_INFO ctci
WHERE
        tta.customer_id = ctci.id AND
        tta.type = 1
AND tta.order_status IN (1, 9)
AND tta.customer_id NOT IN (
SELECT DISTINCT customer_id FROM J_P2P_ORDER WHERE order_type = 1 and product_id !=1
);

select a.acc_no as '用戶名',a.cn_name as '姓名',a.mobile as '銀行預留手機',a.job_phone as '登陸手機',b.order_amount as '投資金額',
c.name as '產品' ,b.lucky_numbers as '幸運號'
from ACTIVITY_LUCKY_NUMBER b left join CRM_T_CUSTOMER_INFO a on b.customer_id = a.id
left join J_P2P_PRODUCT c on b.product_id = c.id
where  b.period='4';

    此次表格樣式以下:

wKiom1aM3LTyDtrAAAAktjWkuIg052.png

    表格格式感受仍是很差看





最終優化:

    此次優化了表格的輸出格式(列名加粗,列的寬度,居中,字體等)

    優化了select.sql文件:裏面能夠寫以「#」開頭的註釋(仍要以「;」結尾)

vim select.sql

#充值未投資用戶#
SELECT
ctci.acc_no AS '帳號',
ctci.cn_name AS '姓名',
ctci.job_phone AS '手機',
ctci.create_date AS '註冊時間',
        tta.amount AS '充值金額',
        tta.create_time AS '充值時間'
FROM
        TPP_T_ACCOUNT_DEAL tta,CRM_T_CUSTOMER_INFO ctci
WHERE
        tta.customer_id = ctci.id AND
        tta.type = 1
AND tta.order_status IN (1, 9)
AND tta.customer_id NOT IN (
SELECT DISTINCT customer_id FROM J_P2P_ORDER WHERE order_type = 1 and product_id !=1
);


#活動投資名單
select a.acc_no as '用戶名',a.cn_name as '姓名',a.mobile as '銀行預留手機',a.job_phone as '登陸手機',b.order_amount as '投資金額',
c.name as '產品' ,b.lucky_numbers as '幸運號'
from ACTIVITY_LUCKY_NUMBER b left join CRM_T_CUSTOMER_INFO a on b.customer_id = a.id
left join J_P2P_PRODUCT c on b.product_id = c.id
where  b.period='4';
#!/usr/bin/env python
#encoding=UTF-8

import os
import time
import xlwt                                  #excel write

hostIp = '10.10.94.157'
user = 'xxxx'
passwd = 'xxxx'
db = 'xxxx'

sqlStr = ''
for i in open('select.sql','r').readlines():
    if i.startswith('#') == True:            #忽略掉#號開頭的行
        pass
    else:
        sqlStr = sqlStr + i
reSql = sqlStr.split(';')                    #將全部的sql語句賦值給reSql; select.sql文件裏的sql語句要以';'結尾

def createTable(selectSql,tableName):
    results = os.popen('mysql -h'+hostIp+' -u'+user+' -p'+passwd+' -D'+db+' -e "'+selectSql+'"').read().strip().split('\n')
    columnName = results[0].split('\t')      #獲取列名

    wb=xlwt.Workbook(encoding='utf-8')       #建立一個excel工做簿,編碼utf-8,表格中支持中文
    sheet=wb.add_sheet('sheet 1')            #建立一個sheet

    rows = len(results)                      #獲取行數
    columns = len(columnName)

    style = xlwt.XFStyle()                   #建立格式style
    font = xlwt.Font()                       #建立font,設置字體
    font.name = 'Times New Roman'            #字體格式
    style.font = font                        #將字體font,應用到格式style
    alignment = xlwt.Alignment()             #建立alignment,居中
    alignment.horz = xlwt.Alignment.HORZ_CENTER      #居中
    style.alignment = alignment              #應用到格式style

    style1 = xlwt.XFStyle()
    font1 = xlwt.Font()
    font1.name = 'Times New Roman'
    #font1.colour_index = 3                  #字體顏色(綠色)
    font1.bold = True                        #字體加粗
    style1.font = font1
    style1.alignment = alignment

    for i in range(columns):
        sheet.col(i).width = 5000            #設置列的寬度

    for i in range(columns):
        sheet.write(0,i,columnName[i],style1)     #將數據插入表格

    for i in range(1,rows):
        for j in range(columns):
            sheet.write(i,j,results[i].split('\t')[j],style)
            #sheet.write(i,j,results[i].split('\t')[j])

    wb.save(tableName)                       #保存表格,並命名爲 充值未投資用戶.xls

excelTime = time.strftime("%Y%m%d")          #獲取當前時間

createTable(reSql[0],excelTime+'充值未投資用戶.xls')
createTable(reSql[1],excelTime+'活動投資名單.xls')

    最終表格格式以下:

wKioL1aNu5-AajsqAAA4GBRLGKg830.png

    是否是很完美!!

相關文章
相關標籤/搜索