pandas+ mysql 线上直接导出excel 和 Django orm + django_pandas 线上直接excel 导出

一、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 #默认插入到最后一列

      

猜你喜欢

转载自blog.csdn.net/QQ1752506968/article/details/90208280
今日推荐