• 关于读取excel 和 写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)
    写入数据库
    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:  # .xsl里的每个sheet
                for row in table.rows:  # row 每一行 数据
                    if not fields:  # 这个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

    ALL_FIELDS = {i.verbose_name: i.name for i in

                  PrepareToCrm._meta.fields if i.name not in EXCLUDES}

    EXCLUDES = [
        'id', 'push_result', 'success', 'pushing', 'exported', 'upload_time'
    ]

    程序写成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 + '
    '  # 拼接备注的字符串
                            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 = "xxxxxt@xxxxxx.com"
        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
  • 相关阅读:
    Spring Boot 系列(九)数据层-集成Spring-data-jpa
    Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理
    Spring Boot 系列(七)Swagger2-生成RESTful接口文档
    Spring Boot 系列(六)web开发-Spring Boot 热部署
    Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎
    Spring Boot 系列(四)静态资源处理
    查看oracle中表的索引
    freemarker模板加载TemplateLoader常见方式
    servlet的生命周期详解
    eclipse 自动创建web.xml
  • 原文地址:https://www.cnblogs.com/niehaidong111/p/9034894.html
Copyright © 2020-2023  润新知