最近开始接手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. 20 Organizing Go code 组织go代码

    Organizing Go code 16 August 2012 Introduction Go code is organized differently to that of other lan ...

  2. Java数据类型以及变量的定义

    1130136248   Java的基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类 ...

  3. 移动端默认meta标签

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><met ...

  4. jmeter之数据库

    https://www.cnblogs.com/ShadowXie/p/6007515.html

  5. 洛谷P2024食物链

    传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...

  6. 浮动元素垂直居中,bootstrap栅格布局垂直居中

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. WiFi无线连接真机进行Appium自动化测试方法

    有时需要测试APP 产品的耗电问题,但用自动化又面临了一个USB接电脑供电的问题,从而导致计算出来的功耗与手动跑,存在有很大的误差,因此可使用wifi无线连接到手机进行自动化测试,解决功耗问题. 前提 ...

  8. C#socket编程序(一)

    在讲socket编程之前,我们先看一下最常用的一些类和方法,相信这些能让你事半功倍. 一.IP地址操作类 1.IPaddress类 a.在该类中有一个 parse()方法,能够把点分十进制IP地址 转 ...

  9. day7 socket网络编程

    Python Socket网络编程 Socket是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的 ...

  10. jquery validate不用submit提交,用js提交的

    jquery validate控件 默认是使用submit提交的, 要想改成使用button的click事件处理函数中手工提交, 可以按照如下方式操作: 1 绑定form的validate, 2 然后 ...