You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Django页面Pastel数据库生成的试算表添加PDF下载按钮

实现方案

我这里提供两种常用实现方式,你可以根据自己的需求选择:

方案1:前端极简实现(完全和页面显示一致,无需修改后端代码)

该方案直接调用前端JS库将页面已渲染的试算表原封不动转为PDF,匹配你要的「原封不动导出」需求,开发成本极低。

第一步:修改trb.html文件

  1. 先给需要导出的试算表容器加唯一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:45:00