前端传递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)
生成的文档