Flask&Pandas ExcelWriter不会使用BytesIO更改列格式

时间:2019-05-13 15:02:45

标签: python excel pandas

在我的Flask页面上,用户可以使用来自熊猫数据框weekly_data的数据下载excel文件。我在xlsxwriter引擎中使用BytesIO和pandas ExcelWriter。

当我编辑worksheet.set_column值(例如列宽或时间格式),刷新服务器和页面时,Excel工作表的格式与以前完全相同。

这是用户单击链接以下载数据时在路由中调用的代码部分:

fn = 'weeklydata_'+(datetime.today().date()).strftime('%d-%b-%y')+'.xlsx'

output = BytesIO()
writer = pd.ExcelWriter(output, engine='xlsxwriter')

weekly_data.to_excel(writer, sheet_name='Sheet1')

workbook = writer.book
worksheet = writer.sheets['Sheet1']

formatTimes = workbook.add_format({'num_format':'hh:mm'})

worksheet.set_column('B:C',None,formatTimes)

worksheet.set_column('A:A',13)
worksheet.set_column('B:C',16)


writer.save()
output.seek(0)

return send_file(output, attachment_filename=fn, as_attachment=True)

此外,我在代码之前添加了print(weekly_data)只是为了检查DataFrame是否正确,并且在下载Excel文件时它不会打印,所以我认为这可能取决于BytesIO?如果相关,我还有另一条路线可以使用类似的代码下载Excel。

反正有看到这些变化吗?感谢您的帮助。

与当前问题无关,但是时间格式是否可以处理大于24小时的小时?在我提到的另一个Excel文件中,所有格式都可以工作(我之前为该Excel创建了代码),但是当我双击它时,任何大于24小时的时间都会恢复为02/01/1900 04:31:00(对于52:31)。 ?

1 个答案:

答案 0 :(得分:2)

关于您的主要问题-如果您更改了代码,但下载的文件相同,则几乎可以肯定是一个缓存问题。 (BytesIO是确定性的。Web应用程序的缓存策略没有那么多。)

有可能在浏览器端进行缓存。在这种情况下,可以通过匿名会话访问相同的视图,甚至可以强制完全重新加载(在Google-chrome上为shift + f5)。

如果您的系统部署在Flask开发服务器之外的其他地方,则缓存可能会在中间层进行-您必须检查配置才能弄清楚。一种解决方法是为每个请求创建一个不同的URL-在服务器端忽略的“ noise”参数,但这将迫使缓存基础结构始终传递完整的请求。换句话说:在生成该文件的请求的URL上插入一个带有随机数据的未使用参数。

显示超过24小时

不确定Excel是否支持它,但应将DataFrame列dtype设置为“ timedelta64 [ns]”,而不是“ datetime”或“ time”。