python导出oracle数据到excel_[Python]查询oracle导出结果至Excel并发送邮件

环境:Linux +python2.7+oracle11g

1、提前安装xlwt(excel写入操作模块),cx_Oracle(oracle操作模块)

cx_Oracle的安装步骤详见链接:https://segmentfault.com/a/1190000009878547

2、脚本如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

import os

reload(sys)

sys.setdefaultencoding('utf8')

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

import cx_Oracle

import xlwt

import datetime

import time

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.application import MIMEApplication

import os.path

filename = 'report_'+time.strftime("%Y-%m-%d")+'.xls'

out_path = '/data/shell/report_'+time.strftime("%Y-%m-%d")+'.xls'

print(out_path)

sheet01 = 'report'+time.strftime("%Y-%m-%d")

#获取发布时间与系统时间为同一个月的数据

sql01="select * from xxxxx where to_char(publish_time,'yyyy-mm-dd')=to_char(sysdate, 'yyyy-mm-dd'); "

workbook = xlwt.Workbook(encoding = 'utf-8') # workbook是sheet赖以生存的载体。

def main(sql,sheet,sheet_name):

conn = cx_Oracle.connect("user/passwd@ip/sid")

cursor =conn.cursor()

result = cursor.execute(sql)

#搜取所有结果

results = cursor.fetchall()

# 获取MYSQL里面的数据字段名称

fields = cursor.description

sheet = workbook.add_sheet(sheet_name,cell_overwrite_ok=True)

# 写上字段信息

for field in range(0,len(fields)):

sheet.write(0,field,fields[field][0])

# 获取并写入数据段信息

row = 1

col = 0

for row in range(1,len(results)+1):

for col in range(0,len(fields)):

sheet.write(row,col,u'%s'%results[row-1][col])

workbook.save(out_path)

_user = "xxx@qq.com"

_pwd = "passwd"

areceiver = "xxx@qq.com" #收件人员

acc = "xxx@qq.com" #抄送人员

#如名字所示Multipart就是分多个部分

msg = MIMEMultipart()

msg["Subject"] =u'【数据统计_' + time.strftime("%Y-%m-%d") + u'】'

msg["From"] = _user

msg["To"] = areceiver

msg["Cc"] = acc

def send_email():

#---这是文字部分---

content = '''Deal all,\n附件是数'''

part = MIMEText(content,'plain','utf-8')

msg.attach(part)

#---这是附件部分---

#xls类型附件

file_name = '/data/shell/' + filename

part = MIMEText(open(file_name,'rb').read(), 'base64', 'gb2312')

part["Content-Type"] = 'application/octet-stream'

basename = os.path.basename(file_name)

part["Content-Disposition"] = 'attachment; filename=%s' % basename.encode('gb2312')

msg.attach(part)

s = smtplib.SMTP("smtp.qq.com", timeout=30)#连接smtp邮件服务器,端口默认是25

s.login(_user, _pwd)#登陆服务器

s.sendmail(_user, areceiver.split(',') + acc.split(','), msg.as_string())#发送邮件

print("Email send successfully")

s.close()

if __name__ == '__main__':

main(sql01,sheet01,sheet01)

send_email()

Oracle获取当月或上个月、下个月

add_months()函数 参数 负数 代表 往前 正数 代表 往后。

--当月

select to_char(sysdate,'yyyymm') from dual;

--上一个月

select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;

--下一个月

select to_char(add_months(trunc(sysdate),1),'yyyymm') from dual;

相关链接:https://blog.csdn.net/u013519551/article/details/46632537

https://blog.csdn.net/mindmb/article/details/7898528

https://blog.csdn.net/my2010sam/article/details/21005941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值