一、pandas +mysql 直接线上导出
import pandas as pd
from django.shortcuts import HttpResponse
import pymysql
def Pandasexcel(req):
outfile = BytesIO()
engine = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
sql="""SELECT * FROM xxxxx WHERE id>210000"""
df=pd.read_sql(sql, engine)
response = HttpResponse(content_type='application/vnd.ms-excel')
execl_name ='test'
response['Content-Disposition'] = 'attachment;filename={0}.xlsx'.format(execl_name)
df.to_excel(outfile, index=False)
response.write(outfile.getvalue())
return response
二、pandas + orm 线上导出excel (导出当前表和表里外键关联对应的数据)
import pandas as pd
from django.shortcuts import HttpResponse
from io import BytesIO
def OrderExcel(req):
"""订单数据导出"""
outfile=BytesIO()
orderser=AppointOrder.objects.all().order_by('create_time')
appos=orderser.values('description',) #这里可以格式化当前表和关联表的数据
orders=pd.DataFrame(appos)
response = HttpResponse(content_type='application/vnd.ms-excel')
execl_name = 'orderexcel%s'%datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
response['Content-Disposition'] = 'attachment;filename={0}.xlsx'.format(execl_name)
orders.rename(columns={'description': '描述', 'wanttime': '预约时间', 'overdue_time': '过期时间'}, inplace=True) # 重定义列名 可修改任意列名
orders.to_excel(outfile, index=False)
response.write(outfile.getvalue())
return response
三、上面有一个不太好的点是不能导出关联当前表的数据,在查看DataFrame输出的数据类型如下
{"a":["sss","ssss"],"b":["cc","eee"]}
所以修改如
orders=pd.DataFrame(appos)
integral=xxx.objects.filter(user=a).values_list('integral',flat=True)
# orders.insert(0,'积分',integral) #插入到第一列
orders['积分']=integral #默认插入到最后一列