最近开始接手BI工作,其中又一个繁琐又不得不做的事,就是每周五都得汇总上个财务周的数据给运营人员!

  作为一个懒人,只能把这件事交由电脑去处理了。

  初步的idea:周五11点前mac自动执行汇总程序->读取数据库数据->写入模版汇总excel->以邮件的形式发送给相关运营人员。

  为了实现此idea并不考虑性能的情况下,选择了实用python这种简单且代码量少的方式。

  首先先实现读取数据库数据部分

  1.python_constant.py(常量部分,肯定要屏蔽具体信息啦,不然被公司投诉了!)

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

 config_b2b = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_B2B'
} config_b2c = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_B2C'
} config_o2o = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_O2O'
} data_b2c = {
'东北区域':'C6',
'海南区域':'C7',
'华北区域':'C8',
'华东区域':'C9',
'华南区域':'C10',
'山东区域':'C11',
'西北区域':'C12',
'中南区域':'C13'
} data_o2o = {
'东北区域':'D6',
'海南区域':'D7',
'华北区域':'D8',
'华东区域':'D9',
'华南区域':'D10',
'山东区域':'D11',
'西北区域':'D12',
'中南区域':'D13'
} data_b2b = {
'东北区域':'E6',
'海南区域':'E7',
'华北区域':'E8',
'华东区域':'E9',
'华南区域':'E10',
'山东区域':'E11',
'西北区域':'E12',
'中南区域':'E13'
}

  2. python_query.py(查询数据,由于查三个库的数据,所以特定三个方法,简单实用!)

 # -*- coding: utf-8 -*-
import pymssql
import python_constant as constant #读取b2c的会员数据
def query_b2c(start_time, end_time):
print('开始查询b2c数据')
conn = pymssql.connect(**constant.config_b2c)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct consignee_mobile) ActiveMem from ( \
select * from openquery(B2C,'SELECT ord.* FROM tbl_order ord, tbl_seller ts \
WHERE ord.seller_no = ts.id AND ord.basic_state <> 404 AND DATE_FORMAT(ord.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.seller_no = ds.StoreId group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询b2c数据')
return result #读取o2o的会员数据
def query_o2o(start_time, end_time):
print('开始查询o2o数据')
conn = pymssql.connect(**constant.config_o2o)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct buyer_phone) ActiveMem from ( \
select * from openquery(O2O, 'SELECT tod.* FROM tbl_order tod,tbl_outlet_basic_info tobi WHERE 1 = 1 AND tod.outlet_id = tobi.outlet_id \
AND DATE_FORMAT(tod.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.outlet_id = ds.StoreId group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询o2o数据')
return result #读取b2b的会员数据
def query_b2b(start_time, end_time):
print('开始查询b2b数据') conn = pymssql.connect(**constant.config_b2b)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct contact_mobile) ActiveMem from ( \
select * from openquery(B2B, 'SELECT * FROM order_info tod\
where DATE_FORMAT(tod.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.supply_user_code = ds.StoreId \
group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询b2b数据')
return result

  3. 实现发送email邮件

 #!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header sender = 'll-chen6@hnair.com'
receiver = 'chenqianyun@ccoop.com.cn'
subject = '每周会员统计数'
smtpserver = 'smtp.hnair.com'
username = 'xxxx'
password = 'xxxx' def send(path):
msg = MIMEText('<html><h1>倩云,你好!汇总数据请查收附件</h1></html>','html','utf-8') msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = Header(subject, 'utf-8') title = '每周会员统计数.xlsx'.decode('utf-8') #构造附件
att = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename=%s' %title.encode('gb2312') msgRoot.attach(msg)
msgRoot.attach(att) smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()

  5. 主体调用

 # -*- coding: utf-8 -*-
from openpyxl import Workbook
from openpyxl import load_workbook
import python_query as query
import python_email as email
import time
import datetime
import python_constant as constant #date_time = datetime.datetime.now()
date_time = datetime.datetime(2017, 2, 28)
dayOfWeek = date_time.weekday()
#假如是星期五则执行查询
if dayOfWeek == 4:
start_date = date_time + datetime.timedelta(-27)
end_time = date_time.strftime("%Y%m%d")
start_time = start_date.strftime("%Y%m%d")
print "开始时间:{0}, 结束时间:{1}".format(start_time, end_time)
#获取当前月份
month = date_time.month
#获取统计周
query_day = start_date.strftime("%m.%d") + '-' + date_time.strftime("%m.%d")
wb = load_workbook('/Users/chenlili/Desktop/BI立项/汇报数据模版/第3周活跃会员数.xlsx')
sheet = wb.get_sheet_by_name(u'Sheet1')
sheet['B2'] = str(month) + '月'
sheet['B4'] = query_day #填充b2c数据
b2c_result = query.query_b2c(start_time, end_time)
if b2c_result:
for data in b2c_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_b2c[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem']
#填充o2o数据
o2o_result = query.query_o2o(start_time, end_time)
if o2o_result:
for data in o2o_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_o2o[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem'] #填充b2b数据
try:
b2b_result = query.query_b2b(start_time, end_time)
if b2b_result:
for data in b2b_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_b2b[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem']
except Exception, e:
print '异常错误: ' + str(e)
else:
pass
finally:
print '解除异常继续执行' path = '/Users/chenlili/Desktop/BI立项/汇报数据模版/第3周活跃会员数副本.xlsx'
wb.save(path) #发送邮件
email.send(path)
else:
print "未到星期五!"

  完结,提供github上的代码:friday_task,暂时未实现自动执行脚本的shell,还在想怎么实现。

  

使用python解决烦人的每周邮件汇总!的更多相关文章

  1. Jmeter之解决烦人的中文乱码问题

    Jmeter是一款国外开源工具,所以就跟LR一样,对中文的支持不是很好,经常会有同学录制脚本后回放或者是发送HTTP请求,看到响应报文里面有乱码! 那如何才能解决这个问题呢?我们分2个情况来分析: 一 ...

  2. win7下解决烦人的管理员权限问题

    禁不住诱惑,用上win7了.可是,对system下的文件进行编辑时候,老是碰到什么必须拥有管理员权限才能进行操作,删除文件或者文件夹也遇到一样的问题.我就纳闷了,我不就是超级管理员吗?我怎么就没有权限 ...

  3. python中烦人的锟斤拷(\xef\xbf\xbd)

    首先要知道\xef\xbf\xbd是啥东西 >>> u'\uFFFD'.encode('utf-8') '\xef\xbf\xbd' 由此我们可以知道\xef\xbf\xbd是utf ...

  4. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  5. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  6. 〖Linux〗干掉Kubuntu烦人的软件升级提示“Update notification daemon”,Your should update ..

    Kubuntu是很好使用,但是升级提示也是太烦人了,开机的时候总是显示如下画面: 使用System Load Indicator(sudo apt-get install indicator-mult ...

  7. 条目六《当心C++编译器中最烦人的分析机制》

    当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制. C++中的普遍规律相符,即尽可能地解释为函数声明. 把形式参数的声明用括号括起来是非 ...

  8. 【转】【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)

    [Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句   ...if (someobject != null) { ...

  9. 使用 Envoy 和 AdGuard Home 阻挡烦人的广告

    原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器.这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题, ...

随机推荐

  1. sed实例收集

    url:http://blog.csdn.net/hepeng597/article/details/7852468 一.元字符集    1)^锚定行的开始 如:/^sed/匹配所有以sed开头的行. ...

  2. mysql高可用架构 -> MHA部署-04

    MHA架构图 本次MHA的部署基于GTID复制成功构建,普通主从复制也可以构建MHA架构. 下载所需的软件包 mkdir /server/tools -p //创建存放包的目录 [root@db01 ...

  3. samba和SELINUX 冲突

    在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”. setsebool -P samba_enable_home_dirs on setsebo ...

  4. 数据库-mysql触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 一:创建触发器 在MySQL中,创建触发器语法 ...

  5. 不同Linux机器之间拷贝文件

    不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...

  6. DedeCMS栏目页调用当前栏目名和上级栏目名

    在构建网页的时候,如果不想逐个写栏目列表页的标题,即列表页标题形式为:{field:seotitle/}_{dede:global.cfg_webname/},其中{field:seotitle/}为 ...

  7. Java标记接口

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------这篇博客主要来谈谈" ...

  8. ASP.NET中Literal,只增加纯粹的内容,不附加产生html代码

    页面代码 <div style="float: right; color: #666; line-height: 30px; margin-right: 12px;" id= ...

  9. Kafka(五)Kafka的API操作和拦截器

    一 kafka的API操作 1.1 环境准备 1)在eclipse中创建一个java工程 2)在工程的根目录创建一个lib文件夹 3)解压kafka安装包,将安装包libs目录下的jar包拷贝到工程的 ...

  10. RAII

    转载:http://www.jellythink.com/archives/101 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C ...