使用pandas保存,这种方法相对简单点。
1.导入第三方库
import cx_Oracle
import openpyxl
import numpy as np
import pandas as pd
2.定义导出函数,在对科学计数问题的处理上和使用openpyxl不太相同,不能直接将所有列转为字符串类型,通过判断列类型为int类型再对该列转为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变为科学计数法导致信息不完整,不能直接df = pd.DataFrame(rows,columns = title).astype(str),这样空值会在excel中保存为NaN等值。
for t in title:
if df.loc[:,t].dtype == 'uint64':
df.loc[:,t] = df.loc[:,t].astype(str)"""
#astype(str)转为str类型,空值将变为'nan'
df = df[df['登记序号'].isin(djxh)].astype(str)
#将'nan'值替换为空,这样在excel中空值不保存为nan
df = df.replace('nan', np.nan)
#保存结果
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()