【搬运自用】Django制作报表 -Python100天从新手到大师Day45(GitHub)

制作报表

原作者:骆昊
https://github.com/jackfrued/Python-100-Days
更多内容欢迎查看并订阅专栏’Python从新手到大师’和‘Django学习’

导出Excel报表

报表就是用表格、图表等格式来动态显示数据,所以有人用这样的公式来描述报表:

报表 = 多样的格式 + 动态的数据

有很多的三方库支持在Python程序中写Excel文件,包括xlwtxlwingsopenpyxlxlswriter等,其中的xlwt虽然只支持写xls格式的Excel文件,但在性能方面的表现还是不错的。下面我们就以xlwt为例,来演示如何在Django项目中导出Excel报表。

安装xlwt

pip install xlwt

导出包含所有老师信息的Excel表格的视图函数。

def export_teachers_excel(request):
    # 创建工作簿
    wb = xlwt.Workbook()
    # 添加工作表
    sheet = wb.add_sheet('老师信息表')
    # 查询所有老师的信息
    queryset = Teacher.objects.all()
    # 向Excel表单中写入表头
    colnames = ('姓名', '介绍', '好评数', '差评数', '学科')
    for index, name in enumerate(colnames):
        sheet.write(0, index, name)
    # 向单元格中写入老师的数据
    props = ('name', 'detail', 'good_count', 'bad_count', 'subject')
    for row, teacher in enumerate(queryset):
        for col, prop in enumerate(props):
            value = getattr(teacher, prop, '')
            if isinstance(value, Subject):
                value = value.name
            sheet.write(row + 1, col, value)
    # 保存Excel
    buffer = BytesIO()
    wb.save(buffer)
    # 将二进制数据写入响应的消息体中并设置MIME类型
    resp = HttpResponse(buffer.getvalue(), content_type='application/vnd.ms-excel')
    # 中文文件名需要处理成百分号编码
    filename = quote('老师.xls')
    # 通过响应头告知浏览器下载该文件以及对应的文件名
    resp['content-disposition'] = f'attachment; filename*=utf-8\'\'{filename}'
    return resp

映射URL。

urlpatterns = [
    
    path('excel/', views.export_teachers_excel),
    
]

导出PDF报表

在Django项目中,如果需要导出PDF报表,可以借助三方库reportlab来生成PDF文件的内容,再将文件的二进制数据输出给浏览器并指定MIME类型为application/pdf,具体的代码如下所示。

def export_pdf(request: HttpRequest) -> HttpResponse:
    buffer = io.BytesIO()
    pdf = canvas.Canvas(buffer)
    pdf.setFont("Helvetica", 80)
    pdf.setFillColorRGB(0.2, 0.5, 0.3)
    pdf.drawString(100, 550, 'hello, world!')
    pdf.showPage()
    pdf.save()
    resp = HttpResponse(buffer.getvalue(), content_type='application/pdf')
    resp['content-disposition'] = 'inline; filename="demo.pdf"'
    return resp

关于如何用reportlab定制PDF报表的内容,可以参考reportlab的官方文档

生成前端统计图表

如果项目中需要生成前端统计图表,可以使用百度的ECharts。具体的做法是后端通过提供数据接口返回统计图表所需的数据,前端使用ECharts来渲染出柱状图、折线图、饼图、散点图等图表。例如我们要生成一个统计所有老师好评数和差评数的报表,可以按照下面的方式来做。

def get_teachers_data(request):
    queryset = Teacher.objects.all()
    names = [teacher.name for teacher in queryset]
    good_counts = [teacher.good_count for teacher in queryset]
    bad_counts = [teacher.bad_count for teacher in queryset]
    return JsonResponse({'names': names, 'good': good_counts, 'bad': bad_counts})

映射URL。

urlpatterns = [
    path('teachers_data/', views.get_teachers_data),
]

使用ECharts生成柱状图。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>老师评价统计</title>
</head>
<body>
    <div id="main" style="width: 600px; height: 400px"></div>
    <p>
        <a href="/">返回首页</a>
    </p>
    <script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js"></script>
    <script>
        var myChart = echarts.init(document.querySelector('#main'))
        fetch('/teachers_data/')
            .then(resp => resp.json())
            .then(json => {
                var option = {
                    color: ['#f00', '#00f'],
                    title: {
                        text: '老师评价统计图'
                    },
                    tooltip: {},
                    legend: {
                        data:['好评', '差评']
                    },
                    xAxis: {
                        data: json.names
                    },
                    yAxis: {},
                    series: [
                        {
                            name: '好评',
                            type: 'bar',
                            data: json.good
                        },
                        {
                            name: '差评',
                            type: 'bar',
                            data: json.bad
                        }
                    ]
                }
                myChart.setOption(option)
            })
    </script>
</body>
</html>

运行效果如下图所示。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程背景:    企业里面很多系统管理后台,用easyui + highcharts + django 进行后台管理的整合,而这块资料在网上资料甚少,很多有经验的朋友在做这块时候也经常出现各种问题,目前我们老师以前在大数据真实项目中用到这块,现在受一些网友建议单独录制easyui + highcharts + django,希望可以帮助那些同学。视频+技术文档+源码让你看过后马上也可以搭建起来。  比如现在的友盟 和 百度统计 都是在类似这样的统计,我们会通过2~3个小时左右的课程,让你掌握这样的技术。   目标人群:  1、初级以上普通开发人员  2、web开发人员,对python感兴趣同学  3、对编程感兴趣的同学   课程目录:  01easyui_highcharts_django整合之需求介绍  02easyui_highcharts_django整合通过pycharm创建项目  03easyui_highcharts_django整合配置路由显示第一个页面  04easyui_highcharts_django整合下载easyui资源并且导入到项目里面  05easyui_highcharts_django整合修改配置文件加载static静态文件  06easyui_highcharts_django整合对页面进行修改  07easyui_highcharts_django整合对合并母模板layout  08easyui_highcharts_django整合添加一个新的业务的代码实现流程  09easyui_highcharts_django整合highcharts简单介绍  10easyui_highcharts_django整合highcharts的整合到django里面  11easyui_highcharts_django整合快速做出另一个业务流程  12easyui_highcharts_django整合柱状图  13easyui_highcharts_django后台返回json数据并且展示   14大数据django后台数据保存到mysql里面  15大数据django从mysql里面读取数据并显示到页面上面  课程环境:    环境:win10,  python 2.7.13,  django 1.8.3 ,  pymsql   收获预期:    1.使用django开发项目  2.学会使用easyui框架  3.学会使用highcharts  4.easyui_highcharts_django开发后面展示项目   案例截图:      

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值