最近开始接手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. java基础23 Math类和Random类

    一.Math数学类 主要是提供很多数学的公式 1.1.Math类的常用方法 abs(int a):绝对值   ceil(double a):向上取整   floor(double a):向下取整   ...

  2. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)

    题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...

  3. 20165333 2016-2017-2 《Java程序设计》第1周学习总结

    20165333 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 java 的地位 Java 的特点 安装JDK 系统环境的设置 Java程序的编写,编译和运 ...

  4. Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇

    https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...

  5. bzoj 2756

    2756 思路: 二分讨论,网络流检验: 代码: #include <bits/stdc++.h> using namespace std; #define INF 1e16 #defin ...

  6. USACO 5.3 Big Barn

    Big BarnA Special Treat Farmer John wants to place a big square barn on his square farm. He hates to ...

  7. 基于 Struts2 的单文件和多文件上传

    文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利.Struts2 已经有默认的 upload 拦截器.我们只需要写参数,它就会自 ...

  8. HTML5 Canvas游戏开发(四)lufylegend开源库件(下)

    一.文本 LTextField对象是lufylegend库件中专门用于显示文本信息的一个对象. 1.文本属性 创建的文本框对象不会自动加入可视化对象列表中.只有手动调用addChild()方法才能使它 ...

  9. TestNG入门到...

    目录 一.概述 二.@Test注解常用参数 三.测试中常用的断言(assert) 四.TestNG常用注解及使用 五.配置文件xml常用标签 六.参数传递 七.测试报告 一.概述 1.TestNG是一 ...

  10. mysql proxy代理安装和配置

    mysql proxy代理安装和配置 服务器说明: 192.168.1.219   mysql主库(主从复制) 192.168.1.177   mysql从库(主从复制) 192.168.1.202 ...