python - Flask & Pandas ExcelWriter 不使用 BytesIO 更改列格式
问题描述
在我的 Flask 页面上,用户可以下载一个带有 pandas 数据框数据的 excel 文件,weekly_data
. 我将 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 小时的时间?02/01/1900 04:31:00
在我提到的另一个 Excel 文件中,所有格式都有效(我刚才为该 Excel 创建了代码),但是当我双击它时,任何超过 24 小时的时间都会恢复为(52:31)之类的东西?
解决方案
至于您的主要问题-如果您更改了代码,但下载的文件是相同的,那几乎可以肯定是缓存问题。(BytesIO 是确定性的。Web 应用程序缓存策略没有那么多)。
缓存有可能发生在浏览器端。如果是这种情况,从匿名会话访问相同的视图,甚至强制完全重新加载(google-chrome 上的 shift + f5)应该可以工作。
如果您的系统部署在 Flask 开发服务器之外的其他地方,那么缓存可能发生在中间层 - 您必须检查您的配置才能弄清楚。一种解决方法是为每个请求创建一个不同的 URL - 一个在服务器端被忽略的“噪音”参数,但这会强制缓存基础设施始终传递完整的请求。换句话说:在生成此文件的请求的 URL 上插入一个带有随机数据的未使用参数。
显示超过 24 小时
不确定 Excel 是否会支持它,但 DataFrame 列的 dtype 应设置为“timedelta64[ns]”,而不是“datetime”或“time”。
推荐阅读
- javascript - 重新初始化在 Formik 中不起作用 - React Native
- pyomo - “str”对象没有属性“is_variable_type”
- c - 如何做线程和Makefile的问题
- android - Redmi 9 和 Android Studio - 通过 USB 安装已禁用
- c++ - 在 Linux 中从 C++ mongocloud 调用 mongofiles
- php - Laravel Relational Eloquent 急切加载如何获取最新的 5 位评论者用户信息
- c# - 根据权限从 Web API 返回属性?
- r - 为什么我在我的 R 代码中的子分配类型修复中出现错误:不兼容的类型(从 S4 到双精度)?
- c# - 如何组合 IEnumerable 的不同值?
- javascript - 传递一个返回数组作为参数的函数