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';
並且表格的列名會本身從查詢結果裏獲取,再也不手動輸入
不過,感受仍是很亂,很複雜,並且依然用了多個函數,並且最終的表格格式還很差看,以下:
第三次嘗試:
此次沒有再用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';
此次表格樣式以下:
表格格式感受仍是很差看
最終優化:
此次優化了表格的輸出格式(列名加粗,列的寬度,居中,字體等)
優化了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')
最終表格格式以下:
是否是很完美!!