python操作SQL和EXCEL进行数据比对

# -*- coding: utf-8 -*-
import pandas as pd
import time
import pyodbc

start = time.time()
ytff = '****'
riqi = '****'
type_ = '****'
wfjm = ****/{0}/{1}/{2}ok.xls'.format(ytff,riqi,type_)
sn = '{}***'.format(type_)

cnxn = pyodbc.connect(DRIVER='{SQL Server}',SERVER='***.***.***.*',
                      DATABASE='**',UID='***',PWD='***')

cursor = cnxn.cursor()

cursor.execute('''
***
                ''') #调用游标指针的execute方法执行sql语句
row = cursor.fetchall() #sql语句执行结果的获取,如果需要一次获取多条记录,可以使用cursor.fetchall()方法
#if row:
#    print (row)

cnxn.commit() 
cnxn.close() 
#
#df = pd.read_excel('***1.xls',
#                        sheet_name = 'Sheet1')
#
#cl = tuple(df['ss'])
column = ['**************************************************']

lenth = len(row)
rowl = list(row)
row1 = []
for i in range(lenth):
    row1.append(list(rowl[i]))
    
    


k3 = pd.read_excel(wfjm,sheet_name = sn)
k3['物料长代码']= k3['物料长代码'].astype('str', copy=True, errors='ignore')
k3['物料长代码'] = k3['物料长代码'].apply(lambda x:str(x))
k3['物料长代码'] = k3['物料长代码'].map(lambda x: x.split('.')[0])

k3['NO'] = k3['单据编号']+'-'+k3['物料长代码']
k30 = k3.groupby(['NO'])[['数量']].agg('sum')

pm = pd.DataFrame(row1,columns = column)
#pm = pd.read_excel(wfjm,sheet_name = 'pm')
pm0 = pm.groupby(['NO'])[['Qty']].agg('sum')

pm_k3 = pm0.merge(k30[['数量']],how='left', on='NO')

#pm_k3['数量'] = pm_k3['数量'].apply(lambda x:float(x))

pm_k3.fillna('0', inplace=True)
pm_k3['数量'] = pm_k3['数量'].astype('float64')
pm_k3['Qty'] = pm_k3['Qty'].astype('float64')
pm_k3['差'] = pm_k3['Qty'] - pm_k3['数量']

pm_add = pm.merge(pm_k3[['差']],how='left', on='NO')
pm_add = pm_add.loc[pm_add['差'] != 0]
pm_add = pm_add.drop('NO',axis = 1)

All = [k3,k30,pm,pm0,pm_k3,pm_add]
name = ['{}序时簿'.format(type_),'序时簿透视表','PM','PM透视表','比对','Add']
wfjm2 = ***/{0}/{1}/{2}ok--{3}条差异.xlsx'.format(ytff,riqi,type_,len(pm_add))

writer = pd.ExcelWriter(wfjm2)
for i in range(6):
    All[i].to_excel(writer,sheet_name=str(name[i]))
writer.save()
end = time.time()
print("总耗时:"+str(end-start)+"秒")

猜你喜欢

转载自blog.csdn.net/weixin_43139613/article/details/89097188