【Python】将数据库中的数据查询出来自动写入excel文档
01
—
链接数据库
import pandas as pd
import xlwings as xw
from sqlalchemy import create_engine
pd.set_option('display.float_format',lambda x : '%.4f' % x)#到小数点后两位,完整显示
def engine():
dbs=["yy_wr:DB@&[email protected]:5567/v2"]
engine=create_engine(
'mysql+pymysql://'+dbs[0],
echo=False,
pool_recycle=7200
)
print("成功链接数据库")
return engine
02
—
将数据库中的查询语句转译到python中
sql="""SELECT DATE_FORMAT(交易时间,'%d') 日期, 服务费,`商户服务费`,流量费,count(*),sum(交易金额) ,'非云闪付' 类别 from transaction_detail_202008 where `收单英文名称`='KQ_ZQ'
and `业务产品` like '%%99%%' and `服务类型` not like '%%云闪付%%'
GROUP BY 1,2,3,4 union all
SELECT DATE_FORMAT(交易时间,'%d') 日期, 服务费,`商户服务费`,流量费,count(*),sum(交易金额),'云闪付' 类别 from transaction_detail_202008 where `收单英文名称`='KQ_ZQ'
and `业务产品` like '%%99%%' and `服务类型` like '%%云闪付%%'
GROUP BY 1,2,3,4;"""
df=pd.read_sql(sql,con=engine())
【他给我的代码,在'%d'中的第一个百分号前还有个%,我这边查出来结果有问题,他那边是正常的,我删掉一个结果才符合预期】
03
—
打开指定的excel工作表新增工作表
app=xw.App()
df_data=app.books.open(r"E:\工作计划\周例会数据分享\2020.8.30\服务费收取数据源.xlsx")
df_data.sheets.add('newsource')
df_sheet=df_data.sheets('newsource')
04
—
将数据库中查询出的结果写入指定的excel区域
df_sheet.range("a1").value="每日交易数据"
df_sheet.range("a1:g1").api.merge
df_sheet.range("a2").value=list(df.columns)
for i in range(3,len(df)+3):
df_sheet.range("a"+str(i)).value=list(df.loc[i-3])
print("每日交易数据保存完成")
【merge函数后面的括号已删除,在同事那边没问题,在我这边报错NoneType,我删掉这个括号才算正常】
05
—
将查出的数据进行汇总处理【透视表】
pdf=df.pivot_table(values="sum(交易金额)",index="日期",columns="类别",aggfunc="sum")
b = pdf.T.agg('sum').T#右侧合计列
pdf['合计']=list(b)
a = pdf.agg('sum')#底部合计行
pdf.loc["合计"]=list(a)
pdf['云闪付占比']=(pdf['云闪付']/pdf['合计']).apply(lambda x:"%.2f%%" % (x * 100))
sever_amount=[]
sever_fee=[]
for i in range(len(pdf)):
sever_amount.append(df[(df['服务费']=='0.060%')&(df['日期']==pdf.index[i])].sum()['sum(交易金额)'])
sever_fee.append(df[(df['服务费']=='0.060%')&(df['日期']==pdf.index[i])].sum()['sum(交易金额)']*0.0006)
pdf['收取服务费交易金额']=sever_amount
pdf['收取服务费金额']=sever_fee
pdf['收取服务费交易金额占比']=(pdf['收取服务费交易金额']/pdf['合计']).apply(lambda x:"%.2f%%" % (x * 100))
pdf['收取服务费交易金额占非云闪付交易比例']=(pdf['收取服务费交易金额']/pdf['非云闪付']).apply(lambda x:"%.2f%%" % (x * 100))
df_sheet.range("i1").value="云闪付交易"
df_sheet.range("i1:m1").api.merge
df_sheet.range("n1").value="服务费与占比"
df_sheet.range("n1:q1").api.merge
df_sheet.range("i2").value=pdf
print('服务费与云闪付数据保存完成')
【这一部分的处理比较复杂,运用到透视表,还运营到条件求和】
06
—
保存&关闭文件,退出app,打印提示信息
df_data.save()#保存文件#文件如果是打开状态,不会报错 但更改不会起作用
df_data.close()#关闭文件关闭之后其他的才能操作#保存时会先检查是否已经存在,如果已经存在会有弹窗提醒
app.quit()
print("保存并关闭")