這里介紹使用python查詢oracle保存為excel的兩種方法,一種用openpyxl保存,另一種用pandas保存。
一、使用openpyxl保存。
1.導(dǎo)入第三方庫
import cx_Oracle
import openpyxl
2.定義導(dǎo)出函數(shù),sql語句為單獨(dú)保存在同一個(gè)文件夾的sql文件,通過打開文件讀取sql語句,不直接把sql語句寫在代碼里可讓代碼顯得簡潔,還可以不必處理sql語句的換行問題。在寫入excel文件時(shí)要注意防止用科學(xué)計(jì)數(shù)法寫入造成信息丟失,先轉(zhuǎn)換為字符串再進(jìn)行保存。
def export_excel(sql,fileName):
rr = curs.execute(sql)
rows = curs.fetchall()
#獲取字段名
title = [ i[0] for i in curs.description ]
#創(chuàng)建excel表
wb = openpyxl.Workbook()
ws = wb.active
#插入字段名到第一行
for c in range(len(title)):
ws.cell(1,c 1,value = title[c])
#寫入查詢數(shù)據(jù)
for r in range(len(rows)):
for c in range(len(rows[r])):
if rows[r][c]: #值不為空時(shí)寫入,空值不寫入
ws.cell(r 2,c 1,value=str(rows[r][c])) #str()防止用科學(xué)計(jì)數(shù)法寫入造成信息丟失
#保存sql腳本
ws1 = wb.create_sheet('sql')
ws1.cell(1,1,value=sql)
wb.save(fileName)
wb.close()
curs.close()
3.主代碼,連接數(shù)據(jù)庫conn = cx_Oracle.connect('user/password@IP/db’,encoding = 'utf-8’) 時(shí)注意添加編碼格式,否則無法顯示中文。
if __name__ == '__main__':
conn = cx_Oracle.connect('user/password@IP/db',encoding = 'utf-8') #utf-8顯示中文
curs= conn.cursor()
#打開sql文件獲取sql語句
with open('查詢語句.sql') as sql_0:
sql = sql_0.read()
export_excel(sql,'book1.xlsx')
conn.close()
二、使用pandas保存,這種方法相對(duì)簡單點(diǎn)。
1.導(dǎo)入第三方庫
import cx_Oracle
import openpyxl
import numpy as np
import pandas as pd
2.定義導(dǎo)出函數(shù),在對(duì)科學(xué)計(jì)數(shù)問題的處理上和使用openpyxl不太相同,不能直接將所有列轉(zhuǎn)為字符串類型,通過判斷列類型為int類型再對(duì)該列轉(zhuǎn)為str類型。
def export_excel(sql,fileName):
rr = curs.execute(sql)
rows = curs.fetchall()
#rows = curs.fetchmany(20)
#獲取字段名
title = [ i[0] for i in curs.description ]
writer = pd.ExcelWriter(fileName)
df = pd.DataFrame(rows,columns = title)
#print(df.loc[:,'DJXH'].dtype)
'''#將int類型改為str類型,防止輸出到excel變?yōu)榭茖W(xué)計(jì)數(shù)法導(dǎo)致信息不完整,不能直接df = pd.DataFrame(rows,columns = title).astype(str),這樣空值會(huì)在excel中保存為NaN等值。
for t in title:
if df.loc[:,t].dtype == 'uint64':
df.loc[:,t] = df.loc[:,t].astype(str)'''
#astype(str)轉(zhuǎn)為str類型,空值將變?yōu)?nan'
df = df[df['登記序號(hào)'].isin(djxh)].astype(str)
#將'nan'值替換為空,這樣在excel中空值不保存為nan
df = df.replace('nan', np.nan)
#保存結(jié)果
df.to_excel(writer,sheet_name = 'result',index = False)
df_sql = pd.DataFrame([sql])
df_sql.to_excel(writer,sheet_name = 'sql',index = False)
writer.save()
curs.close()
3.主代碼,和使用openpyxl相同。
if __name__ == '__main__':
conn = cx_Oracle.connect('user/password@IP/db',encoding = 'utf-8') #utf-8顯示中文
curs= conn.cursor()
#打開sql文件獲取sql語句
with open('查詢語句.sql') as sql_0:
sql = sql_0.read()
export_excel(sql,'book1.xlsx')
conn.close()
聯(lián)系客服