python 后端导出excel使用io流传给前端下载

  1. 需要安装的第三方库
pip install pandas
pip install numpy
pip install openpyxl

2.从数据库读取数据写入Excel文件流

from django.views.decorators.csrf import csrf_exempt
from django.db import connection
import pandas as pd
import io

def _createxcel(numbers):
    excel_file = io.BytesIO()  # 保存文件流
    sql_str = """SELECT distinct bill_rpts.cnumber AS No,bill_rpts.socialcode AS 交款人统一社会信用代码,bill_rpts.payer AS 交款人, convert(VARCHAR(100),bill_rpts.ddate,23) AS 开票日期,
    bill_rpts_items.itemnumber AS 项目编码,bill_rpts_items.itemname AS 项目名称,bill_rpts_items.uunit AS 单位,bill_rpts_items.quantity AS 数量,bill_rpts_items.standard AS 标准,
    convert(DECIMAL(18,2),bill_rpts_items.isum) AS '金额(元)',bill_rpts_items.cnote AS 备注,CONVERT(DECIMAL(18,2),bill_rpts.isum) AS 金额合计,bill_rpts.cnote AS 其他信息,
    code_dep.titlename AS 收款单位,bill_rpts.reviewers AS 收款人,bill_rpts.payee AS 复核人
    FROM bill_rpts
    LEFT JOIN bill_rpts_items ON bill_rpts.cnumber=bill_rpts_items.cnumber 
    LEFT JOIN code_dep ON code_dep.ccode=bill_rpts.ccode_dep 
    WHERE bill_rpts.cnumber IN %s;
    """ % numbers
    df = pd.read_sql_query(sql_str, connection)
    print(df)
    # df.set_index(['No','交款人统一社会信用代码','交款人'])
    # 将 DataFrame 写入 Excel 文件流
    df.to_excel(excel_file, index=False, sheet_name='票据明细表', header=True)
    # 设置文件流指针到开始位置
    excel_file.seek(0)
    return excel_file

3.以io流的形式传给前端处理

@csrf_exempt
def GenerateFile(request):
    ret = {'code': 0, 'data': None, 'msg': None}
    try:
        req = request.body
        str_req = req.decode()
        dict_req = json.loads(str_req)
        numbers = dict_req['cnumbers']
        if numbers:
            excel_file = _createxcel(numbers)
            # print(excel_file.getvalue())
            response = HttpResponse(excel_file.getvalue())
            response["Content-Disposition"] = 'attachment; filename=票据明细.xlsx'
            response["Content-Type"] = 'application/x-xlsx'

            # df = pd.read_excel(io=BytesIO(excel_file.getvalue()))
            # df.fillna('',inplace=True)
            # col_list = df.columns
            # value = df.values
            # print(col_list)
            # print(value)
            return response
        else:
            ret['msg'] = '参数有误'
    except Exception as e:
        ret['msg'] = e
    return HttpResponse(json.dumps(ret))
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 后端将会话数据传递给前端的过程中,一种常见的方法是使用模板引擎。模板引擎可以将后端的数据动态地渲染到前端页面中。 首先,在后端代码中,你需要将会话数据以某种形式存储,比如使用字典或对象。然后,选择一个适合你项目的模板引擎,比如 Jinja2 或 Django 的模板引擎。 接下来,你需要在后端的视图函数中将会话数据传递给模板引擎。这可以通过上下文变量来完成,将会话数据作为变量传递给模板引擎的渲染函数。 最后,你需要在前端的模板文件中使用模板引擎的语法来获取并显示会话数据。 下面是一个简单的示例,以 Flask 框架和 Jinja2 模板引擎为例: 1. 在后端,定义一个视图函数来处理请求: ```python from flask import render_template @app.route('/example') def example(): session_data = {'username': 'Alice', 'age': 25} return render_template('example.html', session=session_data) ``` 2. 在前端,创建一个名为 `example.html` 的模板文件,并使用 Jinja2 的语法显示会话数据: ```html <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <h1>Welcome, {{ session.username }}!</h1> <p>Your age is {{ session.age }}.</p> </body> </html> ``` 在这个示例中,后端将会话数据存储在 `session_data` 字典中,并通过 `render_template` 函数将其传递给模板引擎。前端模板文件通过 `{{ session.username }}` 和 `{{ session.age }}` 的语法来获取并显示会话数据。 这就是一个简单的将会话数据从 Python 后端传递给前端的方法,你可以根据自己的项目需求进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值