需要实现的功能:如在下图1中,根据学号查询张三在数据库里存储的成绩,实现的效果如图2。以下实现过程excel文件、sql文件、python文件都存放在同一个文件夹。

图1

图2
使用openpyxl实现
import cx_Oracle
import openpyxl
import os
if __name__ == '__main__':
pwd = input('输入密码:')
conn = cx_Oracle.connect('用户名/'+pwd+'@IP/数据库实例',encoding = 'utf-8') #utf-8显示中文
curs= conn.cursor()
#打开sql文件获取sql语句
with open('查询成绩.sql') as sql_0:
sql = sql_0.read()
for fileName in os.listdir('.'):
if fileName.endswith('xlsx'):
wb = openpyxl.load_workbook(fileName)
ws = wb['Sheet1']
c = ws.max_column
ws.cell(1,c+1,value = '语文')
ws.cell(1,c+2,value = '数学')
for r in range(2,ws.max_row+1):
if ws.cell(r,1).value:
sql_a = sql.format(ws.cell(r,1).value)
curs.execute(sql_a)
row = curs.fetchone()
if row:
ws.cell(r,c+1,value = row[0])
ws.cell(r,c+2,value = row[1])
#要先添加"添加成绩"文件夹
wb.save('添加成绩\\{}'.format(fileName))
curs.close()
conn.close()
使用pandas实现
import cx_Oracle
import openpyxl
import os
import pandas as pd
if __name__ == '__main__':
pwd = input('输入密码:')
conn = cx_Oracle.connect('用户名/'+pwd+'@IP/数据库实例',encoding = 'utf-8') #utf-8显示中文
curs= conn.cursor()
#打开sql文件获取sql语句
with open('查询成绩.sql') as sql_0:
sql = sql_0.read()
for fileName in os.listdir('.'):
if fileName.endswith('xlsx'):
#读取excel表
df = pd.DataFrame(pd.read_excel(fileName,sheet_name = 'Sheet1'))
#添加空列
df['语文'] = None
df['数学'] = None
for r in range(df.shape[0]):
sql_a = sql.format(str(df.at[r,'学号']))
curs.execute(sql_a)
row = curs.fetchone()
if row:
df.iloc[r,df.columns =='语文'] = row[0]
df.iloc[r,df.columns =='数学'] = row[1]
#要先添加"添加成绩"文件夹
writer = pd.ExcelWriter('添加成绩\\pd{}'.format(fileName))
df.to_excel(writer,index=False)
writer.save()
curs.close()
conn.close()
查询成绩.sql脚本类似以下内容,{}为点位符:
select t.yuwen,t.shuxue
from chengji t
where t.xuehao = '{}'
在使用pandas实现的时候,还可以考虑在数据库先查出所有符合条件的数据到一个DataFrame中,然后再使用merge合并两个DataFrame实现以上功能,python和sql脚本都要做修改。
本文介绍如何使用Python结合openpyxl和pandas库从Oracle数据库查询学生成绩,并将结果写入Excel文件的过程。提供了两种实现方式:一是直接操作单元格,二是通过pandas进行数据处理。
484

被折叠的 条评论
为什么被折叠?



