Procházet zdrojové kódy

建业报表推送服务

Signed-off-by: binren <zhangbr@elab-plus.com>
binren před 4 roky
rodič
revize
d12618a7c3
10 změnil soubory, kde provedl 561 přidání a 95 odebrání
  1. 16 2
      apscheduler_elab.py
  2. 50 18
      email_util.py
  3. 52 5
      excel_util.py
  4. 101 0
      jianye_report.py
  5. 41 0
      mail_content_text.py
  6. 0 69
      panda_util.py
  7. 202 0
      report_file_utils.py
  8. 62 0
      report_public_funs_utils.py
  9. 36 0
      text.html
  10. 1 1
      xlwt_util.py

+ 16 - 2
apscheduler_elab.py

@@ -1,7 +1,6 @@
 # -*- coding: utf-8 -*-
-from panda_util import PandaUtil
-import time
 from report_push import ReportPush
+from jianye_report import JianYeReport
 
 
 class Config(object):
@@ -12,6 +11,7 @@ class Config(object):
         week_push_two: 3
         day_work_two: 4
         day_work_three: 4
+        day_work_four: 5
     """
     JOBS = [
         {
@@ -58,6 +58,15 @@ class Config(object):
             'day_of_week': '*',
             'hour': 8,
             'minute': 30
+        },
+        {
+            'id': 'day_work_four',
+            'func': 'apscheduler_elab:Funcs.day_work_four',
+            'args': '',
+            'trigger': 'cron',
+            'day_of_week': '*',
+            'hour': 6,
+            'minute': 45
         }
     ]
 
@@ -103,6 +112,11 @@ class Funcs(object):
         rp = ReportPush('bi_report')
         rp.report_push_test(4)
 
+    @staticmethod
+    def day_work_four():
+        jianye = JianYeReport()
+        jianye.send_mail_to_customer(5)
+
     @staticmethod
     def minute_push_elab():
         # pdu = PandaUtil('linshi')

+ 50 - 18
email_util.py

@@ -8,6 +8,8 @@ from email.encoders import encode_base64
 import traceback
 import os, random, sys, requests
 from requests_toolbelt.multipart.encoder import MultipartEncoder
+from mail_content_text import MailContentText
+
 
 # https://blog.csdn.net/chuxu8314/article/details/100618710
 # https://blog.csdn.net/Angry_Mills/article/details/79067270
@@ -30,6 +32,9 @@ class EmailUtil(object):
     # 测试环境
     url_test = "http://gatewaytest.elab-plus.com/elab-marketing-sms//mail/sendEmailForReport"
 
+    # 本地
+    url_local = "http://localhost:5303/mail/sendEmailForReport"
+
     url = url_online
 
     # 消息头数据
@@ -85,25 +90,50 @@ class EmailUtil(object):
                             content,
                             receiver,
                             mail_excel,
-                            file_name
+                            file_name,
+                            mail_excel_1=None,
+                            file_name_1=None
                            ):
 
-        with open(mail_excel, 'rb') as f:
-            m = MultipartEncoder(
-                fields={
-                    "enclosure": ('file', f, 'application/octet-stream'),
-                    "mailAddressee": receiver,
-                    "mailContent": content,
-                    "mailEnclosureName": file_name,
-                    "mailTitle": mail_title,
-                    "mailType": "text/html",
-                    "time": ""
-                }
-            )
-            self.headers['Content-Type'] = m.content_type
-            r = requests.post(self.url, data=m, verify=False, headers=self.headers)
-            if r and r.json()['success']:
-                return True
+        if mail_excel_1 is not None:
+            with open(mail_excel, 'rb') as f:
+                with open(mail_excel_1, 'rb') as ff:
+                    m = MultipartEncoder(
+                        fields={
+                            "enclosure": ('file', f, 'application/octet-stream'),
+                            "enclosure1": ('file', ff, 'application/octet-stream'),
+                            "mailAddressee": receiver,
+                            "mailContent": content,
+                            "mailEnclosureName": file_name,
+                            "mailEnclosureName1": file_name_1,
+                            "mailTitle": mail_title,
+                            "mailType": "text/html",
+                            "time": ""
+                        }
+                    )
+                    self.headers['Content-Type'] = m.content_type
+                    r = requests.post(self.url, data=m, verify=False, headers=self.headers)
+                    if r and r.json()['success']:
+                        return True
+        else:
+            with open(mail_excel, 'rb') as f:
+                m = MultipartEncoder(
+                    fields={
+                        "enclosure": ('file', f, 'application/octet-stream'),
+                        "mailAddressee": receiver,
+                        "enclosure1": 'null',
+                        "mailContent": content,
+                        "mailEnclosureName": file_name,
+                        "mailEnclosureName1": 'null',
+                        "mailTitle": mail_title,
+                        "mailType": "text/html",
+                        "time": ""
+                    }
+                )
+                self.headers['Content-Type'] = m.content_type
+                r = requests.post(self.url, data=m, verify=False, headers=self.headers)
+                if r and r.json()['success']:
+                    return True
 
     def send_test(self):
         send_email = EmailUtil()
@@ -113,5 +143,7 @@ class EmailUtil(object):
 
 if __name__ == '__main__':
     send_email = EmailUtil()
-    result = send_email.send_mail_by_admin('移动案场订阅日报', '的数据报告已经准备完成', '15773153135@163.com', r'D:\elab\elab_mvp\resources\report_data\2020-04-14\移动案场订阅周报_庞凌飞_单项目_2020-03-12至2020-03-13.xls', '移动案场订阅周报_庞凌飞_单项目_2020-03-12至2020-03-13.xls', send_email.url_online,send_email.headers)
+    result = send_email.send_mail_by_admin('移动案场订阅日报', MailContentText.text_1.format(1, 2, 3, 4, 5, 6, 7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30, 31, 32), '1285211525@qq.com', r'D:\elab\elab_mvp\resources\report_data\2020-04-14\移动案场订阅周报_庞凌飞_单项目_2020-03-12至2020-03-13.xls', '移动案场订阅周报_庞凌飞_单项目_2020-03-12至2020-03-13.xls',
+                                           r'D:\elab\elab_mvp\resources\111.xlsx', '111.xlsx')
     print(result)
+

+ 52 - 5
excel_util.py

@@ -39,6 +39,9 @@ class ExcelUtil:
         # print('max_row:{}, max_col:{}'.format(work_sheet.max_row, work_sheet.max_column))
         return work_sheet
 
+
+
+
     def init_crowd_info(self):
         """
             整理不同人群包含的父选序号
@@ -345,10 +348,54 @@ class ExcelUtil:
                 pass
         return result
 
+    sql_jianye_1 = """insert into report_push_customer_info(name,house_or_region,customer_type,mail,status,creator,created) values(%s,%s,%s,%s,1,'binren', now())"""
+
+    sql_jianye_2 = """
+        insert into report_customer_authority_info (customer_id, house_or_brand_id, status, creator, created) values (%s, %s, 1, 'binren', now())
+    """
+
+    sql_jianye_3 = """
+        insert into report_task_info(customer_id, task_key, status, creator, created) values (%s, %s, 1, 'binren', now())
+    """
+    def jinaye_report(self):
+        mail_list_sheet = self.read_excel_by_ox_name('邮箱列表')
+        mail_rows =[row for row in mail_list_sheet.rows][1:]
+        customers = []
+        for row in mail_rows:
+            mail = row[0].value
+            name = row[1].value
+            customer_type = row[4].value
+            house_or_region = row[2].value
+            house_or_brand_id = row[6].value
+            # if house_or_brand_id:
+            customers.append([name, house_or_region, customer_type, mail, house_or_brand_id])
+        houses = {}
+        # region_list = self.read_excel_by_ox_name('区域映射关系')
+        # region_rows = [row for row in region_list.rows][1:]
+        # region_names = []
+        # for row in region_rows:
+        #     name = row[2].value
+        #     if name not in region_names:
+        #         region_names.append(name)
+        # for name in region_names:
+        #     ids = []
+        #     for row in region_rows:
+        #         if row[2].value == name:
+        #            ids.append(row[0].value)
+        #     houses[name] = ids
+        return customers
+
 
 if __name__ == '__main__':
-    import json
-    eu = ExcelUtil('Sheet1', '84_1500.xlsx')
-    data = eu.wenjuanxin_84()
-    print(json.dumps(data, ensure_ascii=False, indent=4))
-    print(len(data))
+    from mysql_db import MysqlDB
+    eu = ExcelUtil('邮箱列表', r'D:\elab\elab_mvp\resources\建业邮件推送数据收件信息汇总(1).xlsx')
+    mysql = MysqlDB('linshi', 1)
+    customers = eu.jinaye_report()
+    result1 = mysql.select("select * from report_push_customer_info where created like '2020-04-17%' and customer_type != 3")
+    # mysql.add_some(eu.sql_jianye_1, customers)
+    insert = []
+    for r in result1:
+        for c in customers:
+            if r[1] == c[0] and r[3] == c[2]:
+                insert.append([r[0], c[4]])
+    print(insert)

+ 101 - 0
jianye_report.py

@@ -0,0 +1,101 @@
+from mysql_db import MysqlDB
+from sql import Sql
+from report_public_funs_utils import ReportPublicFunsUtils as rpfu
+from mail_content_text import MailContentText;
+
+
+class JianYeReport(object):
+    """
+        建业报表数据处理
+    """
+
+    def __init__(self):
+        self.db = MysqlDB('bi_report')
+
+    def get_city_house_id(self):
+        return self.db.select(Sql.sql_1)
+
+    def get_report_customers(self):
+        return self.db.select(Sql.sql_2)
+
+    def get_mail_title(self, type, name):
+        """
+            获取邮件名称
+        :param type:1:项目,2:集团,3:区域
+        :param name: 项目 区域名称
+        :return:
+        """
+        month_day = rpfu.get_montho_day()
+        if type == 1:
+            return '[{}]{}数据报表'.format(month_day, name)
+        elif type == 2:
+            return '[{}]建业云集团数据报表'.format(month_day)
+        elif type == 3:
+            return '[{}]建业云{}数据报表'.format(month_day, name)
+
+    def get_mail_content(self, customer_type):
+        """
+            根据客户类型获取邮件正文
+        :param customer_type:
+        :return:
+        """
+        if customer_type == 2:
+            return MailContentText.text_1
+        else:
+            return '{},您的{}数据报表已出,请查看。'
+
+    def table_one_data(self):
+        """
+            表一中的数据是表二数据的汇总
+        :return:
+        """
+        pass
+
+    def table_two_data(self):
+        pass
+
+    def table_three_data(self):
+        pass
+
+    def user_data_volume_statistics(self, time_range, house_ids):
+        """
+            用户浏览量,人数,新增获客,新增获点数据统计
+        :param time_range:
+        :param house_ids:
+        :return:
+        """
+        # 1:总浏览量
+        result = []
+        data_1_1 = self.db.select(Sql.sql_3, [time_range[0], time_range[1], house_ids])
+        number_1_1 = data_1_1[0][0]
+        data_1_2 = self.db.select(Sql.sql_4, [time_range[0], time_range[1], house_ids])
+        number_1_2 = data_1_2[0][0]
+        number_1 = rpfu.add(number_1_1, number_1_2)
+        result.append(number_1)
+        # 2: 总浏览人数
+        data_2 = self.db.select(Sql.sql_5, [time_range[0], time_range[1], house_ids, time_range[0], time_range[1], house_ids])
+        number_2 = data_2[0][0]
+        result.append(number_2)
+        # 3:新增获客
+        time_1 = time_range[0] + ' 00:00:00'
+        time_2 = time_range[1] + ' 23:59:59'
+        data_3 = self.db.select(Sql.sql_6, [time_1, time_2, house_ids, time_1, time_2, house_ids])
+        number_3 = data_3[0][0]
+        result.append(number_3)
+        # 4:新增获电
+        data_4 = self.db.select(Sql.sql_7, [time_1, time_2, house_ids, house_ids, time_1, time_2])
+        number_4 = data_4[0][0]
+        result.append(number_4)
+        return result
+
+    def send_mail_to_customer(self, task_key):
+        """
+            统计数据推送给客户
+        :param: task_key
+        :return:
+        """
+        pass
+
+
+if __name__ == '__main__':
+    pass

+ 41 - 0
mail_content_text.py

@@ -0,0 +1,41 @@
+
+
+class MailContentText(object):
+    text_1 = """
+        <!DOCTYPE html>
+        <html>
+        <head>
+        <meta charset="utf-8">
+        <title>elab数据报表推送服务</title>
+        </head>
+        <body>
+            <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px; padding-bottom: 1px"><b>集团{}月{}日数据概览</b></h4>
+            <ol style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px; padding-bottom: 5px">
+                 <li>总浏览量:{},总浏览人数: {}</li>
+                 <li>新增获客: {}, 新增获电: {}</li>
+                 <li> 推荐用户数: {},分享获电: {},裂变获电: {}</li>
+                 <li>全民经纪人注册数:{}</li>
+                 <li>报备成功数: {}, 报备到访数: {}</li>
+            </ol>
+            <hr />
+            <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px"><b>集团{}月累计数据概览</b></h4>
+                <ol  style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px">
+                    <li>总浏览量:{} ,总浏览人数:xx</li>
+                    <li>新增获客: {}, 新增获电:xx</li>
+                    <li>推荐用户数: {},分享获电: {},裂变获电: {}</li>
+                    <li>全民经纪人注册数:{}</li>
+                    <li>报备成功数: {}, 报备到访数: {}</li>
+                </ol>
+                <hr />
+            <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px;"><b>集团上线以来累计数据概览</b></h4>
+                <ol  style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px">
+                    <li>总浏览量:{} ,总浏览人数: {}</li>
+                    <li>新增获客: {}, 新增获电: {}</li>
+                    <li>推荐用户数: {},分享获电: {},裂变获电: {}</li>
+                    <li>全民经纪人注册数:{}</li>
+                    <li>报备成功数: {},报备到访数: {}</li>
+                </ol>
+            <hr />
+        </body>
+        </html>
+    """

+ 0 - 69
panda_util.py

@@ -1,69 +0,0 @@
-from mysql_db import MysqlDB
-
-
-class PandaUtil(object):
-    def __init__(self, db_name):
-        self.con = MysqlDB(db_name, db_type=1).con
-        pass
-
-    def query_data(self, sql):
-        df = pd.read_sql_query(sql, self.con)
-        return df
-
-    def panda_chart(self, df_list, cols, title_x, title_y, file_name):
-        """
-        data of narray
-        index of data_frame:  [0,1,2,3]
-        cols numbers of static columns
-        """
-
-        writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
-        for i, df in enumerate(df_list):
-            # df = pd.DataFrame(data, index=None, columns=["姓名", "饱和度", "人力"])
-            sheet_name = f'Sheet{i}'
-            df.to_excel(writer, sheet_name=sheet_name, index=False)
-            workbook = writer.book
-            worksheet = writer.sheets[sheet_name]
-            chart = workbook.add_chart({'type': 'column'})
-            # set colors for the chart each type .
-            colors = ['#E41A1C', '#377EB8', '#4DAF4A', '#984EA3', '#FF7F00', '#7CFC00', '	#76EEC6', '#7EC0EE', '#00F5FF']
-            # Configure the series of the chart from the dataframe data.
-            for col_num in range(1, cols + 1):
-                chart.add_series({
-                    'name': [f'{sheet_name}', 0, col_num],
-                    'categories': [f'{sheet_name}', 1, 0, 4, 0],  # axis_x start row ,start col,end row ,end col
-                    'values': [f'{sheet_name}', 1, col_num, 4, col_num],  # axis_y value of
-                    'fill': {'color': colors[col_num - 1]},  # each type color choose
-                    'overlap': -10,
-                })
-
-            # Configure the chart axes.
-            chart.set_x_axis({'name': f'{title_x}'})
-            chart.set_y_axis({'name': f'{title_y}', 'major_gridlines': {'visible': False}})
-            chart.set_size({'width': 900, 'height': 400})
-            # Insert the chart into the worksheet.
-            worksheet.insert_chart('H2', chart)
-        writer.save()
-        writer.save()
-
-
-if __name__ == '__main__':
-    # pdu = PandaUtil('linshi')
-    # sql = 'select house_id, COUNT(house_id) as number from t_house_image group by house_id limit 5'
-    # df_data = pdu.query_data(sql)
-    # print(df_data.size)
-    # pdu.panda_chart([df_data], 1, 'title x', 'title y', 'pandas_chart_columns2.xlsx')
-    # send_email = EmailUtil()
-    # send_email.send_mail(mail_excel='pandas_chart_columns2.xlsx')
-    import pandas as pd
-    import numpy as np
-
-    df = pd.DataFrame({'ID': [1, 2, 3, None, 5, 6, 7, 8, 9, 10],
-                       'Name': ['Tim', 'Victor', 'Nick', None, 45, 48, '哈哈', '嗯呢', 'ess', 'dss'],
-                        'address': ['美国', '试试', '单独', None, '刚刚', '信息', '报表', '公司', '是否', '是否'],
-                       'address': ['美国', '试试', '单独', None, '刚刚', '信息', '报表', '公司', '是否', '是否'],
-                       'address': ['美国', '试试', '单独', None, '刚刚', '信息', '报表', '公司', '是否', '是否']
-                       }
-                      )
-    df.set_index("ID")
-    df.to_excel('output.xlsx')

+ 202 - 0
report_file_utils.py

@@ -0,0 +1,202 @@
+import xlwt
+
+
+class ReportFileUtils:
+    def __init__(self):
+        self.wb = xlwt.Workbook()
+        self.styleOK = xlwt.easyxf()
+        self.default_style = self.set_style('Times New Roman',
+                       200,
+                       bold=False,
+                       format_str='', align='')
+    pass
+
+    def set_style(self, name, height, bold=False, format_str='', align='center'):
+        style = xlwt.XFStyle()  # 初始化样式
+
+        font = xlwt.Font()  # 为样式创建字体
+        font.name = name  # 'Times New Roman'
+        font.bold = bold
+        font.height = height
+
+        borders = xlwt.Borders()  # 为样式创建边框
+        borders.left = 2
+        borders.right = 2
+        borders.top = 0
+        borders.bottom = 2
+
+        alignment = xlwt.Alignment()  # 设置排列
+        if align == 'center':
+            alignment.horz = xlwt.Alignment.HORZ_CENTER
+            alignment.vert = xlwt.Alignment.VERT_CENTER
+        else:
+            alignment.horz = xlwt.Alignment.HORZ_LEFT
+            alignment.vert = xlwt.Alignment.VERT_BOTTOM
+
+        style.font = font
+        style.borders = borders
+        style.num_format_str = format_str
+        style.alignment = alignment
+
+        return style
+
+    def horizontal_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
+        """
+            横向单元格合并
+        :param ws:
+        :param start_row:
+        :param end_row:
+        :param start_col:
+        :param end_col:
+        :param content:
+        :return:
+        """
+        ws.write_merge(
+            start_row,
+            end_row,
+            start_col,
+            end_col,
+            content,
+            self.set_style(
+                'Times New Roman',
+                320,
+                bold=True,
+                format_str=''))
+
+    def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
+        self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
+
+    def vertical_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
+        """
+            纵向单元格合并
+        :param ws:
+        :param start_row:
+        :param rows:
+        :param start_col:
+        :param end_col:
+        :param content:
+        :return:
+        """
+        ws.write_merge(
+            start_row,
+            end_row,
+            start_col,
+            end_col,
+            content,
+            self.set_style(
+                'Times New Roman',
+                320,
+                bold=True,
+                format_str=''))  # 合并单元格
+
+    def insert_cells(self, ws, data, start_row, start_col, end_col):
+        for index, v in enumerate(data):
+            y = 0
+            for col in range(start_col, end_col):
+                value = v[y]
+                if value is None:
+                    value = 0
+                ws.col(col).width = 150 * 30  # 定义列宽
+                ws.write(start_row, col, str(value),
+                         style=self.default_style)
+                y += 1
+            start_row += 1
+
+    def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
+        """
+            空白占位
+        :param ws:
+        :param start_row:
+        :param end_row:
+        :param start_col:
+        :param end_col:
+        :return:
+        """
+        self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
+
+    def create_excel_file(self, data, sheet_names, title, headers, save_path):
+        """
+            生成excel文件, data, sheet_names,headers 三者在数量上要对应
+        :param data: 数据
+        :param sheet_names: 工作簿名称
+        :param title: 文件名称
+        :param headers: 每个工作簿表头
+        :return:
+        """
+        for index, d in enumerate(data):
+            # 创建工作簿
+            sheet_name = sheet_names[index]
+            header = headers[index]
+            ws = self.wb.add_sheet(sheet_name, cell_overwrite_ok=True)
+            # 写入数据
+            # 区域
+            start_row = 0
+            # 写入标题
+            self.horizontal_cell_merge(ws, start_row, start_row, 0, len(header) - 1, sheet_name)
+            start_row += 1
+
+            # 写入表头
+            self.insert_cells(ws, [headers[index]], start_row, 0, len(header))
+            start_row += 1
+            city_info = {}
+            insert_data = []
+            region_info = {}
+            data_size = 0
+            for key in d.keys():
+                region_rows = 0
+                value = d.get(key)
+                region_name = key
+                # 城市
+                for key_1 in value.keys():
+                    value_1 = value.get(key_1)
+                    city_name = key_1
+                    region_rows += len(value_1)
+                    insert_data.extend(value_1)
+                    city_info[city_name] = len(value_1)
+                    data_size = len(value_1[0])
+                region_info[region_name] = region_rows
+            # 合并区域
+            for key in region_info.keys():
+                print(key)
+                self.vertical_cell_merge(ws, start_row, start_row + region_info.get(key) - 1, 0, 0, key)
+                start_row += region_info.get(key)
+            # 城市合并
+            start_row = 2
+            for key in city_info.keys():
+                 self.vertical_cell_merge(ws, start_row, start_row + city_info.get(key) - 1, 1, 1, key)
+                 start_row += city_info.get(key)
+
+            # 写入数据
+            start_row = 2
+            self.insert_cells(ws, insert_data, start_row, 2, 2 + data_size)
+        self.wb.save(save_path + '/' + title)
+
+
+if __name__ == '__main__':
+    rf = ReportFileUtils()
+    data = [
+                {"华北": {"上dfsd海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
+                        "北dfsdf京": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
+                        },
+                 "嘻嘻哈哈": {"上dfssd海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
+                        "北dfsdssf京": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
+                        }
+                 },
+                {"华北": {"上海ss": [['建业1', 21, 31, 41, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
+                        "北京ss": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
+                        }
+                 },
+
+                {"华北": {"上sdsfs海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
+                        "sddss": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
+                        }
+                 }
+
+        ]
+
+    sheet_names = ['前一日数据', '本月数据', '上线后所有']
+    title = "测ss试.xlsx"
+    headers = [['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
+               ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
+               ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝']]
+    rf.create_excel_file(data, sheet_names, title, headers, r'D:\elab\elab_mvp\test')

+ 62 - 0
report_public_funs_utils.py

@@ -0,0 +1,62 @@
+import datetime
+
+
+class ReportPublicFunsUtils:
+    @staticmethod
+    def get_time_range_month(type):
+        """
+            获取当月一号到当前时间的时间区间
+        :param type 1:y m d 2: y m d : s m m
+        :return:
+        """
+        now_time = datetime.datetime.now()
+        first_day_of_month = datetime.datetime.now().strftime('%Y-%M')
+        if type == 1:
+           return [first_day_of_month + '-01 00:00:00', now_time.strftime('%Y-%m-%d %M:%I:%S')]
+        else:
+            return [first_day_of_month + '-01', now_time.strftime('%Y-%m-%d')]
+
+    @staticmethod
+    def get_prd_day(type):
+        now_time = datetime.datetime.now()
+        pre_time = now_time + datetime.timedelta(days=-1)
+        now_time = now_time + datetime.timedelta(days=-1)
+        if type == 1:
+            return [pre_time.strftime('%Y-%m-%d %M:%I:%S'), now_time.strftime('%Y-%m-%d %M:%I:%S')]
+        else:
+            repr([pre_time.strftime('%Y-%m-%d'), now_time.strftime('%Y-%m-%d')])
+
+    @staticmethod
+    def get_all_time_data_range(type):
+        now_time = datetime.datetime.now()
+        pre_time = now_time + datetime.timedelta(days=-9999)
+        if type == 1:
+            return [pre_time.strftime('%Y-%m-%d %M:%I:%S'), now_time.strftime('%Y-%m-%d %M:%I:%S')]
+        else:
+            return [pre_time.strftime('%Y-%m-%d'), now_time.strftime('%Y-%m-%d')]
+
+    @staticmethod
+    def get_montho_day():
+        now = datetime.datetime.now()
+        month = now.month
+        day = now.day
+        return '{}月{}日'.format(month, day)
+
+    @staticmethod
+    def add(a=None, b=None):
+        """
+            求和
+        :param a:
+        :param b:
+        :return:
+        """
+        if a and b:
+            return a + b
+        elif a and not b:
+            return a
+        elif b and not a:
+            return b
+        return 0
+
+if __name__ == '__main__':
+    print(ReportPublicFunsUtils.get_montho_day())

+ 36 - 0
text.html

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>elab数据报表推送服务</title>
+</head>
+<body>
+    <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px; padding-bottom: 1px"><b>集团{}月{}日数据概览</b></h4>
+    <ol style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px; padding-bottom: 5px">
+         <li>总浏览量:{},总浏览人数: {}</li>
+         <li>新增获客: {}, 新增获电: {}</li>
+         <li> 推荐用户数: {},分享获电: {},裂变获电: {}</li>
+         <li>全民经纪人注册数:{}</li>
+         <li>报备成功数: {}, 报备到访数: {}</li>
+    </ol>
+    <hr />
+    <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px"><b>集团{}月累计数据概览</b></h4>
+        <ol  style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px">
+            <li>总浏览量:{} ,总浏览人数:xx</li>
+            <li>新增获客: {}, 新增获电:xx</li>
+            <li>推荐用户数: {},分享获电: {},裂变获电: {}</li>
+            <li>全民经纪人注册数:{}</li>
+            <li>报备成功数: {}, 报备到访数: {}</li>
+        </ol>
+        <hr />
+    <h4 style="font-family: 'Microsoft YaHei UI'; font-size: 20px;"><b>集团上线以来累计数据概览</b></h4>
+        <ol  style="font-family: 'Microsoft YaHei UI'; font-size: 15px; line-height: 20px">
+            <li>总浏览量:{} ,总浏览人数: {}</li>
+            <li>新增获客: {}, 新增获电: {}</li>
+            <li>推荐用户数: {},分享获电: {},裂变获电: {}</li>
+            <li>全民经纪人注册数:{}</li>
+            <li>报备成功数: {},报备到访数: {}</li>
+        </ol>
+    <hr />
+</body>
+</html>

+ 1 - 1
xlwt_util.py

@@ -111,7 +111,7 @@ class XlwtUtil(object):
         """
         ws.write_merge(
             start_row,
-            2 + len(rows) - 1,
+            2 + rows - 1,
             start_col,
             end_col,
             content,