【问题标题】:Flask & Pandas ExcelWriter not changing column format with BytesIOFlask 和 Pandas ExcelWriter 不使用 BytesIO 更改列格式
【发布时间】:2019-09-30 13:47:40
【问题描述】:

在我的 Flask 页面上,用户可以下载包含来自 pandas 数据框 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)?

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

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

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

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

    显示超过 24 小时

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

    【讨论】:

    • 似乎缓存是问题,我以隐身模式打开它并出现了更改(但 cmd+shift+r 在正常会话中不起作用,我不得不重新启动 chrome)。至于时间增量,我不确定它是否适用于 Excel,所以我暂时将其保留为字符串。谢谢!
    • Timedelta 不打算被 excel 理解 - 这个想法是 Pandas excel 导出器过滤器将其理解为“时间量”,并设置适当的 excel 列类型。
    • (我没有尝试在画布端注释列类型 = 但在电子表格程序中,我必须将列号设置为“时间”,将演示掩码设置为 HH:MM.0它工作)
    猜你喜欢
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多