
这是代码
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 |