Django学习之django配置vue完成数据库数据的excel形式的文件下载

 

将数据库中的数据写入excel文件并下载的流程梳理

后端实现

后台url.py

urlpatterns = [
        ....
    re_path('^host/host_excel/', views.HostExcelView.as_view()),
]

后台视图views.py

class HostExcelView(APIView):
    # 下载host数据excel文件
    def get(self,request):
        #1 读取数据库数据
        all_host_data = models.Host.objects.all().values('id', 'category', 'hostname', 'ip_addr', 'port', 'username','desc', 'evrironments')
        print(all_host_data)

        # 2 写入excel并保存
        # 关于excel的操作,参考我的博客
        # 创建excel
        ws = xlwt.Workbook(encoding='utf-8')
        # 创建工作簿
        st = ws.add_sheet('主机数据')

        # 写标题行
        st.write(0, 0, 'id')
        st.write(0, 1, 'category')
        st.write(0, 2, 'hostname')
        st.write(0, 3, 'ip_addr')
        st.write(0, 4, 'port')
        st.write(0, 5, 'username')
        st.write(0, 6, 'desc')
        st.write(0, 7, 'evrironments')

        # 写入数据,从第一行开始
        excel_row = 1
        for host_obj in all_host_data:
            st.write(excel_row, 0, host_obj.get('id'))
            st.write(excel_row, 1, host_obj.get('category'))
            st.write(excel_row, 2, host_obj.get('hostname'))
            st.write(excel_row, 3, host_obj.get('ip_addr'))
            st.write(excel_row, 4, host_obj.get('port'))
            st.write(excel_row, 5, host_obj.get('username'))
            st.write(excel_row, 6, host_obj.get('desc'))
            st.write(excel_row, 7, host_obj.get('evrironments'))
            excel_row += 1

        # sio = BytesIO()
        # 将数据写入io数据流,不用在本地生成excel文件,不然效率就低了
        sio = BytesIO()
        ws.save(sio)
        sio.seek(0)
        # print(sio.getvalue())


        #3 将excel数据响应回客户端
        response = HttpResponse(sio.getvalue(), content_type='application/vnd.ms-excel')
        # response['Content-Disposition'] = 'attachment; filename=xx.xls'
        
        # 文件名称中文设置
        from django.utils.encoding import escape_uri_path
        response['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path('主机列表数据.xls'))
        response.write(sio.getvalue()) #必须要给response写入一下数据,不然不生效

        return response

前端vue实现

其实不管是不是vue,都可以,因为就是一个a标签就能搞定

<a style="color:#fff;" href="http://api.hippo.com:8000/host/host_excel/"> 导出主机列表数据</a>
注意:href属性的值,是你要访问的后台路径

 

 

 

 

 

 

 

posted @ 2021-01-20 12:23  cls超  阅读(470)  评论(0编辑  收藏  举报