如何为Django页面Pastel数据库生成的试算表添加PDF下载按钮
实现方案
我这里提供两种常用实现方式,你可以根据自己的需求选择:
方案1:前端极简实现(完全和页面显示一致,无需修改后端代码)
该方案直接调用前端JS库将页面已渲染的试算表原封不动转为PDF,匹配你要的「原封不动导出」需求,开发成本极低。
第一步:修改trb.html文件
- 先给需要导出的试算表容器加唯一ID,同时添加下载按钮:
{% extends "main/base.html"%} {% block content%} <h1>Kyle Database Trial Balance</h1> <!-- 新增下载按钮 --> <button id="downloadPdfBtn" class="btn btn-primary mb-3">下载试算表PDF</button> <br> <br> <!-- 给容器加id,标记需要导出的区域 --> <div class="container" id="trialBalanceWrapper"> <!-- 原有代码保持不变 --> <div class="row mb-0"> ... 你的原有试算表代码全部保留 ... </div> </div> <!-- 新增PDF导出逻辑 --> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script> <script> document.getElementById('downloadPdfBtn').addEventListener('click', function() { const exportContent = document.getElementById('trialBalanceWrapper'); const options = { margin: 10, filename: 'Kyle试算表.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } }; html2pdf().set(options).from(exportContent).save(); }); </script> {% endblock %}
可调整参数说明
- 如果你需要横版导出,把
orientation值改成landscape - 调整
scale参数可以修改PDF清晰度,数值越大越清晰 margin参数可以调整PDF页边距,单位是mm
方案2:后端实现(更稳定,适合正式生产环境)
如果你的试算表数据量很大,前端导出可能出现分页异常、加载慢的问题,可以用后端生成PDF的方案。
第一步:安装依赖
执行命令安装WeasyPrint PDF生成库:
pip install weasyprint
第二步:新增导出视图(views.py)
from django.http import HttpResponse from django.template.loader import render_to_string from weasyprint import HTML def export_trb_pdf(request): # 复用你原有查询逻辑 desc = "SELECT Description FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor = cnxn.cursor(); cursor.execute(desc); description = [tup[0] for tup in cursor.fetchall()] accNo = "SELECT Account FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor.execute(accNo); accountNo = [tup[0] for tup in cursor.fetchall()] deb = "SELECT Debit FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor.execute(deb); debit = [tup[0] for tup in cursor.fetchall()] cred = "SELECT Credit FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor.execute(cred); credit = [tup[0] for tup in cursor.fetchall()] Debtotal = "SELECT SUM(Debit) AS total FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor.execute(Debtotal); totalDebit = [tup[0] for tup in cursor.fetchall()] # 注意:你原有代码这里写错了,Credit总金额应该统计SUM(Credit),不是SUM(Debit) Credtotal = "SELECT SUM(Credit) AS total FROM [Kyle].[dbo].[_btblCbStatement] WHERE Account <> ''" cursor.execute(Credtotal); totalCredit = cursor.fetchall() # 渲染模板为HTML字符串 html_string = render_to_string('main/Kyletrb.html', { "description":description, "accountNo":accountNo, "debit":debit, "credit":credit, "totalDebit":totalDebit, "totalCredit":totalCredit, "is_pdf_export": True # 标记是PDF导出,可隐藏页面其他不需要导出的元素比如下载按钮 }) # 生成PDF response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="Kyle试算表.pdf"' HTML(string=html_string).write_pdf(response) return response
第三步:配置路由(urls.py)
新增导出接口路由:
path('export-trb-pdf/', views.export_trb_pdf, name='export_trb_pdf'),
第四步:页面添加导出按钮
在trb.html的合适位置加按钮即可:
<a href="{% url 'export_trb_pdf' %}" class="btn btn-primary mb-3">下载试算表PDF</a>
注意事项
- 你原有views.py里的Credit总统计SQL写错了,统计的是Debit的总和,建议先修正这个问题避免导出数据错误
- 前端方案导出的PDF和你页面显示效果100%一致,不需要调整额外样式,适合快速实现需求
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

