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'] = ''
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 + '\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)
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())

关于读取excel 和 写excel的更多相关文章

  1. C# 读带复选框的excel,写excel并设置字体、边框、背景色

    这是一篇excel读写功能大汇总,通过C#调用Microsoft.Office.Interop.Excel.dll才能完成任何复杂格式excel的读写操作. 本文需要读取的excel格式如下: 可见表 ...

  2. python中使用xlrd读excel使用xlwt写excel

    原文地址 :http://www.bugingcode.com/blog/python_xlrd_read_excel_xlwt_write_excel.html 在数据分析和运营的过程中,有非常多的 ...

  3. Python:使用第三方库xlwt来写Excel

    继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...

  4. java的poi技术写Excel的Sheet

    在这之前写过关于java读,写Excel的blog如下: Excel转Html java的poi技术读,写Excel[2003-2007,2010] java的poi技术读取Excel[2003-20 ...

  5. java的poi技术读,写Excel[2003-2007,2010]

    在上一篇blog:java的poi技术读取Excel[2003-2007,2010] 中介绍了关于java中的poi技术读取excel的相关操作 读取excel和MySQL相关: java的poi技术 ...

  6. 读取和导出下载 excel 2003,2007 资料

    protected void Page_Load(object sender, EventArgs e) { //直接在bin add referece search Microsoft.Office ...

  7. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

  8. Pandas 基础(4) - 读/写 Excel 和 CSV 文件

    这一节将分别介绍读/写 Excel 和 CSV 文件的各种方式: - 读入 CSV 文件 首先是准备一个 csv 文件, 这里我用的是 stock_data.csv, 文件我已上传, 大家可以直接下载 ...

  9. python读、写、修改、追写excel文件

    三个工具包 python操作excel的三个工具包如下 xlrd: 对excel进行读相关操作 xlwt: 对excel进行写相关操作 xlutils: 对excel读写操作的整合 注意,只能操作.x ...

随机推荐

  1. 采用VSPD、ModbusTool模拟串口、MODBUS TCP设备进行Python采集软件开发

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 不少仪器/设备都提供了数据采集的接口,其中不少是串口或网络的MODBUS/TCP协议. 串口是比较简单 ...

  2. Redisson 分布式锁

    Redisson_百度百科https://baike.baidu.com/item/Redisson/20856570 redission 分布式锁 - 穆穆兔兔 - 博客园https://www.c ...

  3. java内存模型详解

    对于本篇文章,将从四个概念来介绍:内存模型基础,重排序,顺序一致性和happens-before 1.内存模型基础 在并发编程中,有两个关键问题:线程之间如何通信和如何同步.由此而引出了两种并发模型: ...

  4. Android——具有边框的Textview

    我们可以看见很多类似瀑布流的分类: 通过边框进行选择,那么这个边框是怎么变成的呢? 我们可以通过添加背景图,不过有更加简单的,如下: 我们在drawable文件中编写一个shape, <?xml ...

  5. UVA 1627 Team them up!

    https://cn.vjudge.net/problem/UVA-1627 题目 有n(n≤100)个人,把他们分成非空的两组,使得每个人都被分到一组,且同组中的人相互认识.要求两组的成员人数尽量接 ...

  6. redis哨兵(Sentinel)、虚拟槽分区(cluster)和docker入门

    一.Redis-Sentinel(哨兵) 1.介绍 Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,r ...

  7. animation 动画

    语法 animation: name duration timing-function delay iteration-count direction fill-mode play-state ani ...

  8. 初步了解jQuery

    jQuery 库可以通过一行简单的标记被添加到网页中. jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多"的JavaScript库. jQ ...

  9. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  10. 在mobaxterm内连接deb使用lrzsz进行文件传输

    lrzsz随手传文件还是挺方便的. 1.apt install lrzsz 2.rz 3.右键 或者control右键选择 send file useing Z-modem 选择文件上传 接收同理