python - Flask 和 Pandas ExcelWriter 不使用 BytesIO 更改列格式

标签 python excel pandas

在我的 Flask 页面上,用户可以下载包含 pandas 数据框 weekly_data 数据的 Excel 文件。我正在使用 BytesIO 和 pandas ExcelWriter 以及 xlsxwriter 引擎。

当我编辑 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)当我双击它时?

最佳答案

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

缓存有可能发生在浏览器端。如果是这种情况,从匿名 session 访问相同的 View ,甚至强制完全重新加载(在 google-chrome 上按 shift + f5)应该可以。

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

显示超过 24 小时

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

关于python - Flask 和 Pandas ExcelWriter 不使用 BytesIO 更改列格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56115069/

相关文章:

python - 使用另一个数组中的索引位置映射 Pandas 系列字符串

Python pandas 通过 dt 访问器有效地将日期时间转换为时间戳

python 对额外的括号敏感?

python - 如何在大数据文件中使用 pandas 删除重复的行?

excel - 数据到位后停止公式运行

excel - 如何在Lua中读取并解析excel文件?

python - 多行为空时如何进行合并

python - Keras/Tensorflow 中基于切片的分配?

python - 如何在 Python 中写入多个文件?

excel - 在 Mac 上使用终端通过 Excel 打开文件