【Django DRF Apps】从零搭建一个导出 Excel 和 PDF的app应用 ...

张春  论坛元老 | 2025-1-26 05:46:41 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在已有的django drf项目中创建一个用于报表天生的 Django DRF 应用,支持 Excel 和 PDF 格式的报表天生与导出功能,可以分为几个步调来完成:

  • 集整天生 Excel 和 PDF 的库

    • Excel:利用 openpyxl 或 xlsxwriter。
    • PDF:利用 reportlab 或 weasyprint。

  • 创建 API 端点:通过 DRF 提供 Excel 和 PDF 报表的下载接口。
一、安装必要的库

首先,安装所需的库:
  1. pip install openpyxl reportlab
复制代码
二、创建 Django App

假设我们创建一个名为 report 的应用,用于报表天生功能。
  1. python manage.py startapp report_app
复制代码
在 report 应用中创建报表天生逻辑。
三、实现报表天生功能

1. Excel 报表天生

利用 openpyxl 来天生 Excel 格式的报表。
  1. # report/utils.py
  2. from openpyxl import Workbook
  3. from io import BytesIO
  4. def generate_excel_report(data):
  5.     wb = Workbook()
  6.     ws = wb.active
  7.     # 设置表头
  8.     ws.append(["ID", "Name", "Amount"])
  9.     # 填充数据
  10.     for row in data:
  11.         ws.append([row['id'], row['name'], row['amount']])
  12.     # 保存为字节流
  13.     byte_io = BytesIO()
  14.     wb.save(byte_io)
  15.     byte_io.seek(0)
  16.     return byte_io
复制代码
2. PDF 报表天生

利用 reportlab 来天生 PDF 格式的报表。
  1. # report/utils.py
  2. from reportlab.lib.pagesizes import letter
  3. from reportlab.pdfgen import canvas
  4. from io import BytesIO
  5. def generate_pdf_report(data):
  6.     buffer = BytesIO()
  7.     c = canvas.Canvas(buffer, pagesize=letter)
  8.     c.setFont("Helvetica", 12)
  9.     y_position = 750
  10.     # 写入表头
  11.     c.drawString(100, y_position, "ID")
  12.     c.drawString(200, y_position, "Name")
  13.     c.drawString(300, y_position, "Amount")
  14.     y_position -= 20
  15.     # 写入数据
  16.     for row in data:
  17.         c.drawString(100, y_position, str(row['id']))
  18.         c.drawString(200, y_position, row['name'])
  19.         c.drawString(300, y_position, str(row['amount']))
  20.         y_position -= 20
  21.     # 保存为字节流
  22.     c.save()
  23.     buffer.seek(0)
  24.     return buffer
复制代码
3. 创建 API 端点

在 report/views.py 中创建 API 端点来返回报表。
  1. # report/views.py
  2. from rest_framework.views import APIView
  3. from rest_framework.response import Response
  4. from rest_framework import status
  5. from rest_framework.permissions import IsAuthenticated
  6. from django.http import HttpResponse
  7. from .utils import generate_excel_report, generate_pdf_report
  8. class ReportGenerationView(APIView):
  9.     permission_classes = [IsAuthenticated]
  10.     def get(self, request, report_type):
  11.         # 模拟数据,实际应用中可以从数据库中获取
  12.         data = [
  13.             {"id": 1, "name": "John", "amount": 100},
  14.             {"id": 2, "name": "Jane", "amount": 200},
  15.             {"id": 3, "name": "Doe", "amount": 300}
  16.         ]
  17.         
  18.         if report_type == 'excel':
  19.             file = generate_excel_report(data)
  20.             response = HttpResponse(file, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
  21.             response['Content-Disposition'] = 'attachment; filename="report.xlsx"'
  22.             return response
  23.         
  24.         elif report_type == 'pdf':
  25.             file = generate_pdf_report(data)
  26.             response = HttpResponse(file, content_type='application/pdf')
  27.             response['Content-Disposition'] = 'attachment; filename="report.pdf"'
  28.             return response
  29.         
  30.         return Response({"error": "Invalid report type"}, status=status.HTTP_400_BAD_REQUEST)
复制代码
4. 配置 URL 路由

在 report/urls.py 配置路由,将报表天生功能暴露为 API 端点。
  1. # report/urls.py
  2. from django.urls import path
  3. from .views import ReportGenerationView
  4. urlpatterns = [
  5.     path('generate-report/<str:report_type>/', ReportGenerationView.as_view(), name='generate-report'),
  6. ]
复制代码
5. 注册 URL 路由

确保在主项目的 urls.py 中注册 report 应用的 URL。
  1. # project/urls.py
  2. from django.contrib import admin
  3. from django.urls import path, include
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('report/', include('report.urls')),
  7. ]
复制代码
四、完成后端逻辑

如今,我们已经完成了以下功能:


  • 报表天生的 API (/report/generate-report/excel/ 或 /report/generate-report/pdf/)。
  • 支持 Excel 和 PDF 格式的报表天生与导出。
五、测试

启动 Django 项目并利用 API 哀求:


  • GET /report/generate-report/excel/:下载 Excel 报表。
  • GET /report/generate-report/pdf/:下载 PDF 报表。
六、扩展功能(可选)


  • 分页支持:当数据量很大时,可以支持分页天生报表。
  • 格式定制:根据需求,可以自界说报表的格式,如添加更多的表头、内容格式化等。
  • 权限控制:根据用户权限,限制哪些用户可以下载报表。
这样就完成了一个基本的报表天生 Django DRF 应用,可以根据需要进一步扩展和优化。
源码

已在github开源

Django封装高复用高可移植的apps系列

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表