有需求需要将数据以excel形式输出,基本思路如下:
定义Excel工作本对象 => 查询数据 => 写入工作本对象 => 转换为二进制流返回
遇到的问题是如何在不将文件落盘的情况下,转为二进制流输出。
查找了一些资料,对比使用后,如下方法:
伪代码:
# 创建工作本
f = xlwt.Workbook()
# 工作本写入数据
f.write()
# 创建二进制流
buf = io.BytesIO()
# excel文件的二进制流写到流中
f.save(buf)
# 从流中读取数据到ff
buf.seek(0)
ff = buf.read()
# 最后可以将ff保存或者发送
函数代码如下:
def download_excel():
# 定义样式
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = 'SimHei'
font.bold = True
font.color_index = 4
font.height = 220
style.font = font
# 定义工作本
f = xlwt.Workbook()
# sheet
sheet1 = f.add_sheet('API文档', cell_overwrite_ok=True)
# 标题
sheet1.write_merge(0, 0, 0, 1, 'API文档', style)
# 写第一列
colum0 = ["名称", "描述", "URL", "方式", "内容"]
for i in range(0, len(colum0)):
sheet1.write(i + 1, 0, colum0[i], style)
# 写第二列
colum1 = [model_obj.model_name, model_obj.model_params, model_obj.url, model_obj.method, model_obj.model_readme]
for i in range(0, len(colum1)):
sheet1.write(i + 1, 1, colum1[i], style)
# 创建二进制流
buf = io.BytesIO()
f.save(buf) # excel文件的二进制流写到buf
buf.seek(0)
ff = buf.read()
name = "{}.xls".format(model_obj.model_name.split(".")[0])
response = HttpResponse(ff)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{}"'.format(name)
return response