这是代码
def download_excel():
try:
logger.info('download_excel, %s' % str(request.form))
form_data = json.loads(request.form.get('data'))
header_names = form_data['header_names']
headers = form_data['headers']
rows = form_data['list']
data = OrderedDefault(list)
for row in rows:
for i, header_name in enumerate(header_names):
header = headers[i]
data[header_name].append(row[header])
file_name = 'temp_data/temp.xlsx'
pd.DataFrame(data).to_excel(file_name, index=False)
response = make_response(send_file(file_name))
return response
except Exception as e:
logger.exception(e)
return make_response('Error', 301)
修改完后代码
def download_excel():
try:
logger.info('download_excel, %s' % str(request.form))
form_data = json.loads(request.form.get('data'))
header_names = form_data['header_names']
headers = form_data['headers']
rows = form_data['list']
data = OrderedDefault(list)
for row in rows:
for i, header_name in enumerate(header_names):
header = headers[i]
data[header_name].append(row[header])
bf = io.BytesIO()
pd.DataFrame(data).to_excel(bf, index=False)
logger.info('Excel file size: {}'.format(bf.tell()))
bf.seek(0)
return send_file(bf, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e:
logger.exception(e)
return make_response('Error', 301)
1
Nostalgiaaaa 2019-08-19 17:05:24 +08:00
试试 StringIO ?
|
2
aieike OP @Nostalgiaaaa 我试了,但没成功,可能我的方法不对
|
3
vZexc0m 2019-08-19 17:26:19 +08:00
|
4
sunhk25 2019-08-19 17:26:24 +08:00 via Android
参考一下 https://zdyxry.github.io/2018/07/08/Flask-%E6%B5%81%E5%BC%8F%E5%93%8D%E5%BA%94/
这个功能以后有时间也想实现一下 |
6
aieike OP |
7
wuwukai007 2019-08-19 18:09:22 +08:00 via Android
有个问题,这个 io 是放在内存当中,如何放入 redis 中呢,或者集成到类似 django 的 cache 中
|
8
janxin 2019-08-19 18:13:56 +08:00
@wuwukai007 这个 io 是 file-like,支持读写操作
|
9
wuwukai007 2019-08-19 18:17:38 +08:00 via Android
@ janxin 我的意思是,如果用户量大的话,这个 io 是用的本地的内存,怎么用 redis 之类作为 io 的存储
|
10
reself 2019-08-19 21:47:11 +08:00 via Android
用 BytesIO 试试看,pandas 有个 ExcelWriter 组件,可以往 filelike 的对象里写东西。对了,io 对象写好过后记得要 seek(0)。
|
11
1462326016 2019-08-20 08:18:07 +08:00
一楼的意思应该是 BytesIO ?
|
12
ebingtel 2019-08-20 08:59:32 +08:00
@wuwukai007 既然是 file-like,可以 read 出来,存进 redis 的吧?但是存个 excel 的 io 好,还是存原始的数据,这个还需要权衡下
|
14
aieike OP 还有一个问题,想问一下, 这个 Bytesio 需不需要像文件那样 close
|
15
LUXiaobo 2019-08-21 15:01:31 +08:00
试试 tempfile
|