flask vue 文件流的方式下载word

前端传递uuid,后端根据uuid找到对应的记录,把数据填充导word文档中,以文件流的方式传递给前端实现下载功能,这样后端就不用先保存再根据路径下载了

这是重点,必须加,不然下载的文件是乱码

{responseType: 'blob'}
//下载功能
    async download(row){ 
      let formData = new FormData();
      formData.append("uuid", row.uuid);
      const { data: res } = await request.post("download",formData,{responseType: 'blob'});
      // console.log(res)
      // return
        //下载文件
            let blob = new Blob([res], {
              type: "application/msword",
            });
            let objectUrl = URL.createObjectURL(blob); // 创建URL
            const link = document.createElement("a");
            link.href = objectUrl;
            link.setAttribute("download", row.studentname + '.docx');
            link.click(); // 下载文件
            URL.revokeObjectURL(objectUrl); // 释放内存

    },

主要代码

        f = BytesIO()
        # 保存doc文档
        document.save(f)
        f.seek(0)
        filename = quote('demo.docx')
		// 中文文件名编码
        # rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)
        return send_file(f, download_name=filename,as_attachment=True)

完整代码

    def post(self):
        uuid = request.form.get('uuid')
        # uuid = request.args.get("uuid")
        order_obj = Addorder.query.filter_by(tabs_id=uuid).first()
        # 前置信息
        agent_name = order_obj.agent_name
        order_id = order_obj.order_id
        studentname = order_obj.studentname
        sex = order_obj.sex
 ---------------------------------------------------------------------------------------------------------------
        # 构建doc对象
        document = Document()
        if order_obj.school_list:
            school_list = eval(order_obj.school_list)
            # 操作文档标题
            document.add_heading('前置信息', 0)

            # 操作段落文本
            document.add_paragraph('中介名称')
            document.add_paragraph(
                agent_name, style='List Bullet'
            )

            # 操作段落文本
            document.add_paragraph('订单号')
            document.add_paragraph(
                order_id, style='List Bullet'
            )

            # 操作段落文本
            document.add_paragraph('学生姓名')
            document.add_paragraph(
                studentname, style='List Bullet'
            )

            # 操作段落文本
            document.add_paragraph('性别')
            document.add_paragraph(
                sex, style='List Bullet'
            )

            # 操作段落文本
            document.add_paragraph('学校列表')

            infos_list = []

            for i in school_list:
                for j in i['zhuanye']:
                    info_list = []
                    info_list.append(i['schoolname'])
                    info_list.append(j['major'])
                    info_list.append(j['link'])
                    infos_list.append(tuple(info_list))
            infos_tuple = tuple(infos_list)

            # print(len(infos_tuple))
            # print(infos_tuple)
            # 添加表格,rows设置行 cols设置列
            table = document.add_table(rows=1, cols=3)
            # 首行设置背景色
            rows = table.rows[0]
            for cell in rows.cells:
                shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))
                cell._tc.get_or_add_tcPr().append(shading_elm)

            hdr_cells = table.rows[0].cells

            # 设置列名
            hdr_cells[0].text = '学校名称'
            hdr_cells[1].text = '专业'
            hdr_cells[2].text = '链接'

            # 操作写入行
            for schoolname, major, link in infos_tuple:
                row_cells = table.add_row().cells
                row_cells[0].text = schoolname
                row_cells[1].text = major
                row_cells[2].text = link
            document.add_page_break()

        if order_obj.motivation:
            # 动机
            motivation = eval(order_obj.motivation)
            # document = motivations(document,motivation)

            # 操作文档标题
            document.add_heading('动机', 0)

            # 操作段落文本
            reason = document.add_paragraph(
                '喜欢这个专业的原因?(兴趣起源、家庭背景氛围对你的影响,提供一个小事例,使你对这个专业或领域产生兴趣) ')
            # 段落添加内容
            run = reason.add_run('是否润色:')
            # 对run内容加粗
            run.bold = True
            # 设置run字体
            run.font.size = Pt(12)

            document.add_paragraph(
                motivation['moti1'], style='List Bullet'
            )

            # 操作段落文本
            acamadic = document.add_paragraph(
                '是否有具体的学术兴趣点,例如金融可以精确至投资、证券;教育可以精确至数字科技对教学评估的影响;药理可以精确至专门针对癌症的研究成果关注;材料学可以精确至陶瓷性能;数字媒体可以精确至大数据分析/云端储存;法律可以精确至公司法、未成年人法……具体些会提升PS个性化 ')
            # 段落添加内容
            run = acamadic.add_run('是否润色:')
            # 对run内容加粗
            run.bold = True
            # 设置run字体
            run.font.size = Pt(12)

            document.add_paragraph(
                motivation['moti2'], style='List Bullet'
            )

            # 操作段落文本
            recent = document.add_paragraph(
                "最近社会上的热门事件中,是否有与你申请的专业方向相关的事件?请谈一谈你对此的观点(该事件引发了你对目标专业的哪些思考,对于你纵深去学习目标专业有何启发,暴露了目标专业或领域的哪些弊端或契机)")
            # 段落添加内容
            run = recent.add_run('是否润色:')
            # 对run内容加粗
            run.bold = True
            # 设置run字体
            run.font.size = Pt(12)

            document.add_paragraph(
                motivation['moti3'], style='List Bullet'
            )
            document.add_page_break()

-------------------------------------------------------------------------------------------------------------------

        # document.save('tet.docx')
        f = BytesIO()
        # 保存doc文档
        document.save(f)
        f.seek(0)
        filename = quote('demo.docx')

        # rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)
        return send_file(f, download_name=filename,as_attachment=True)

生成的文档

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值