关于读取excel 和 写excel

def prepare_crm_data_from_excel(request):
    '''Get potential student from excel
    '''
    if request.method == 'POST':
        user = request.user
        result_dict = {}
        if not request.FILES:
            return HttpResponse('请选择上传文件')
        f = request.FILES['file']
        if str(f).split('.')[-1] not in ['xlsx', 'xls']:
            return HttpResponse('请上传(xlsx, xls)')
        wb2 = openpyxl.load_workbook(f)
        fields = []
        datas = []
        crm_list = []
        for table in wb2.worksheets:
            for row in table.rows:
                if not fields:
                    fields.extend([column.value for column in row])
                    continue
                d = {}
                index = 0
                for column in row:
                    try:
                        d[index] = column.value.strip()
                    except AttributeError:
                        d[index] = column.value
                    index += 1
                if any(d.values()):
                    datas.append(d)

        order_fields = {i[0]: i[1] for i in enumerate(fields)}

        for data in datas:
            d = {'user': user}
            for k, v in list(data.items()):
                key_index = order_fields[k]
                if not key_index:
                    continue
                crm_key = ALL_FIELDS[key_index]
                d[crm_key] = v
            crm_list.append(d)
        sync_db(crm_list)

        result_dict['result'] = 'ok'
        return Response(result_dict, status=status.HTTP_200_OK)

    html = """<form action="" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" /><input type="submit"/></form>"""
    response = HttpResponse(html)
    response["Allow-Control-Allow-Origin"] = '*'
    return response
上传读取excel
def sync_db(data_list):
    '''Synchron potential student from excel to PrepareToCrm
    '''
    push_list = []
    m_q = {i['mobile']: i['qudao_details'] for i in
           PrepareToCrm.objects.values('mobile', 'qudao_details')}
    [m_q.setdefault(i['phone'], i['qudao_details'])
     for i in PrepareToCrm.objects.filter(phone__isnull=False).values(
         'phone', 'qudao_details')]
    [m_q.setdefault(i['other_phone'], i['qudao_details'])
     for i in PrepareToCrm.objects.filter(other_phone__isnull=False).values(
         'other_phone', 'qudao_details')]

    for data_dict in data_list:
        try:
            if data_dict['mobile'] == data_dict['phone']:
                data_dict['phone'] = None
        except KeyError:
            data_dict['phone'] = None
        try:
            if data_dict['mobile'] == data_dict['other_phone']:
                data_dict['other_phone'] = None
        except KeyError:
            data_dict['other_phone'] = None
        try:
            if data_dict['phone'] == data_dict['other_phone']:
                data_dict['other_phone'] = None
        except KeyError:
            data_dict['other_phone'] = None

        mobile = str(data_dict['mobile']) if data_dict['mobile'] else None
        phone = str(data_dict['phone']) if data_dict['phone'] else None
        other_phone = str(
            data_dict['other_phone']) if data_dict['other_phone'] else None

        mobiles = [i for i in [mobile, phone, other_phone] if i]

        if not mobiles:
            data_dict['push_result'] = '啥电话都没有'
            data_dict['feedback'] = True
        else:
            for mobile in mobiles:
                if mobile not in m_q:
                    m_q[mobile] = data_dict['qudao_details']
                else:
                    qudao_details = m_q[mobile]
                    data_dict['push_result'] = '重复推送({})'.format(
                        qudao_details)
                    data_dict['feedback'] = True
        if not data_dict['create_user']:
            data_dict['create_user'] = '9007'
        push_list.append(PrepareToCrm(**data_dict))

    PrepareToCrm.objects.bulk_create(push_list)
写入数据库

程序写成Excel 发送邮箱

def run():
    EXCEL_CACHE_PATH = "/tmp/_BI_EXCEL_CACHE"
    xlsxfile = '{}/push_result.xlsx'.format(EXCEL_CACHE_PATH)

    custom_set = PrepareToCrm.objects.filter(user__isnull=False, feedback=True)
    if custom_set.exists():
        user_list = set([custom_obj.user_id for custom_obj in custom_set])
        for user_id in user_list:
            mobile_set = custom_set.filter(user_id=user_id).values('mobile', 'name', 'success', 'apply_contry')
            result_list = [['学生姓名', '电话', '申请国家', '申请项目', '跟进顾问', '分校',
                            '是否成功推送', 'BI客户状态', 'CRM客户状态', '备注'], ]
            for mo_name in mobile_set:
                mobile = mo_name.get('mobile')
                name = mo_name.get('name')
                success = '推送成功' if mo_name.get('success') else '推送失败'
                apply_contry = mo_name.get('apply_contry')

                crp_status = '无状态'
                crm_status = '无状态'

                ad_set = Advisor_potential_student.objects.filter(
                    Q(mobile__contains=mobile) | Q(phone__contains=mobile) |
                    Q(other_phone__contains=mobile)).values('pk', 'status', 'education', 'advisor__address_city',
                                                            'advisor__full_name')
                crm_set = CrmDB.objects.using('crm').filter(
                    Q(mobile__contains=mobile) | Q(phone__contains=mobile) |
                    Q(other_phone__contains=mobile)).values('latest_status')

                education = ''
                address_city = ''
                full_name = ''
                con_l = []
                con_str = ''
                if ad_set.exists():
                    status_num = ad_set[0]['status']
                    education = ad_set[0]['education']
                    address_city = ad_set[0]['advisor__address_city']
                    full_name = ad_set[0]['advisor__full_name']
                    potential_id = ad_set[0]['pk']
                    crp_status = SOURCE_STATUS.get(status_num)

                    remark_set = Advisor_student_remark.objects.filter(potential_id=potential_id).values('create_at', 'content').order_by('-create_at')

                    for remark in remark_set:
                        time = remark['create_at'].strftime('%Y-%m-%d %H:%M:%S')
                        content = remark['content']
                        w_content = '' + time + '' + ' ' + content + '\n'  # 拼接备注的字符串
                        con_l.append(w_content)
                    content_str = con_str.join(con_l)
                else:
                    content_str = ''

                if crm_set.exists():
                    try:
                        status_num = crm_set[0]['latest_status']
                        crm_status = crm_status_dict.get(int(status_num))
                    except Exception as e:
                        crm_status = '无状态'
                result_list.append(
                    [name, mobile, apply_contry, education, full_name, address_city, success, crp_status, crm_status, content_str])

            xlsx = openpyxl.Workbook()
            table = xlsx.active
            table.title = 'data'

            for line in result_list:
                table.append(line)

            xlsx.save(xlsxfile)
            send_mail(user_id)
View Code
def send_mail(user_id):
    email_obj = User.objects.filter(id=user_id).values('email')[0]
    to_email = email_obj['email']
    if not to_email:
        return
    SMTP_HOST = "xxxxxx.qq.com"
    AUTH_USER = "[email protected]"
    AUTH_PASS = "xxxxxxxxxxxx123"

    email = MIMEMultipart()

    to_list = [
        to_email
    ]

    from_addr = 'xxxxxxxxxxxx.com'
    email['From'] = from_addr
    email['To'] = Header(COMMASPACE.join(to_list), 'utf8')
    email['Subject'] = Header('推送失败反馈', 'utf-8')
    xlsxfile = '/tmp/_BI_EXCEL_CACHE/push_result.xlsx'
    with open(xlsxfile, 'rb') as f:
        attach = MIMEApplication(f.read())
        attach.add_header('Content-Disposition', 'attachment',
                          filename='push_result.xlsx')
        email.attach(attach)

    smtp = smtplib.SMTP_SSL(SMTP_HOST)
    smtp.login(AUTH_USER, AUTH_PASS)
    smtp.sendmail(from_addr, to_list, email.as_string())
View Code

猜你喜欢

转载自www.cnblogs.com/niehaidong111/p/9034894.html