【Django DRF Apps】从零搭建一个导出 Excel 和 PDF的app应用
在已有的django drf项目中创建一个用于报表天生的 Django DRF 应用,支持 Excel 和 PDF 格式的报表天生与导出功能,可以分为几个步调来完成:[*] 集整天生 Excel 和 PDF 的库:
[*]Excel:利用 openpyxl 或 xlsxwriter。
[*]PDF:利用 reportlab 或 weasyprint。
[*] 创建 API 端点:通过 DRF 提供 Excel 和 PDF 报表的下载接口。
一、安装必要的库
首先,安装所需的库:
pip install openpyxl reportlab
二、创建 Django App
假设我们创建一个名为 report 的应用,用于报表天生功能。
python manage.py startapp report_app
在 report 应用中创建报表天生逻辑。
三、实现报表天生功能
1. Excel 报表天生
利用 openpyxl 来天生 Excel 格式的报表。
# report/utils.py
from openpyxl import Workbook
from io import BytesIO
def generate_excel_report(data):
wb = Workbook()
ws = wb.active
# 设置表头
ws.append(["ID", "Name", "Amount"])
# 填充数据
for row in data:
ws.append(, row['name'], row['amount']])
# 保存为字节流
byte_io = BytesIO()
wb.save(byte_io)
byte_io.seek(0)
return byte_io
2. PDF 报表天生
利用 reportlab 来天生 PDF 格式的报表。
# report/utils.py
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from io import BytesIO
def generate_pdf_report(data):
buffer = BytesIO()
c = canvas.Canvas(buffer, pagesize=letter)
c.setFont("Helvetica", 12)
y_position = 750
# 写入表头
c.drawString(100, y_position, "ID")
c.drawString(200, y_position, "Name")
c.drawString(300, y_position, "Amount")
y_position -= 20
# 写入数据
for row in data:
c.drawString(100, y_position, str(row['id']))
c.drawString(200, y_position, row['name'])
c.drawString(300, y_position, str(row['amount']))
y_position -= 20
# 保存为字节流
c.save()
buffer.seek(0)
return buffer
3. 创建 API 端点
在 report/views.py 中创建 API 端点来返回报表。
# report/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.http import HttpResponse
from .utils import generate_excel_report, generate_pdf_report
class ReportGenerationView(APIView):
permission_classes =
def get(self, request, report_type):
# 模拟数据,实际应用中可以从数据库中获取
data = [
{"id": 1, "name": "John", "amount": 100},
{"id": 2, "name": "Jane", "amount": 200},
{"id": 3, "name": "Doe", "amount": 300}
]
if report_type == 'excel':
file = generate_excel_report(data)
response = HttpResponse(file, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="report.xlsx"'
return response
elif report_type == 'pdf':
file = generate_pdf_report(data)
response = HttpResponse(file, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="report.pdf"'
return response
return Response({"error": "Invalid report type"}, status=status.HTTP_400_BAD_REQUEST)
4. 配置 URL 路由
在 report/urls.py 配置路由,将报表天生功能暴露为 API 端点。
# report/urls.py
from django.urls import path
from .views import ReportGenerationView
urlpatterns = [
path('generate-report/<str:report_type>/', ReportGenerationView.as_view(), name='generate-report'),
]
5. 注册 URL 路由
确保在主项目的 urls.py 中注册 report 应用的 URL。
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('report/', include('report.urls')),
]
四、完成后端逻辑
如今,我们已经完成了以下功能:
[*]报表天生的 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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]