使用python根据excel的值在oracle数据库中查询相关的数据

本文介绍如何使用Python结合openpyxl和pandas库从Oracle数据库查询学生成绩,并将结果写入Excel文件的过程。提供了两种实现方式:一是直接操作单元格,二是通过pandas进行数据处理。

需要实现的功能:如在下图1中,根据学号查询张三在数据库里存储的成绩,实现的效果如图2。以下实现过程excel文件、sql文件、python文件都存放在同一个文件夹。
图1
图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脚本都要做修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值