【问题标题】:openpyxl time format not consistentopenpyxl时间格式不一致
【发布时间】:2021-07-03 09:39:06
【问题描述】:

我尝试从 openpyxl 设置单元格的时间格式。 Excel 中所需的格式字符串是'TT.MM.JJJJ hh:mm'。通过 ws['A1'].number_format = 'TT.MM.JJJJ hh:mm' 在 openpyxl 中设置此项会导致在打开工作簿时出现错误消息。在 openpyxl 中读取手动格式化的单元格会得到'm/d/yy h:mm'。如果我将其设置为新单元格,结果将再次显示在 Excel 中,并带有 'TT.MM.JJJJ hh:mm'

所以'TT.MM.JJJJ hh:mm' 肯定不同于'm/d/yy h:mm'

这很奇怪。我在 Excel 中使用德语格式。谁能解释这里出了什么问题?

【问题讨论】:

  • 您必须使用英语(美国)格式约定。

标签: python excel openpyxl time-format


【解决方案1】:

并不是真正的答案,只是为了确认这里有一些本地化/i18n“魔法”破坏了游戏。

在 Excel 中,我创建了一个包含 4 个内容相同的单元格的表格:07.04.2021 17:05:00 和以下 number_format(在 Excel 中设置)。然后我使用pd.ExcelFile(只读,默认使用openpyxl)打开文件并检查数字格式。结果:

Excel Openpyxl
TT.MM.JJJJ hh:mm m/d/yy h:mm
TT.MM.JJJJ mm-dd-yy
MMM JJ mmm-yy
[h]:mm:ss [h]:mm:ss

将第 3 行更改为 MMMM JJJJ 时,openpyxl 会报告 mmmm\\ yyyy。因此,源语言环境(即 DE 中的 TT.MM.JJJ)的典型“默认样式”似乎在全球/英语上下文中由 Excel 的默认值(m/d/yy)“巧妙地”适应。只有不寻常的自定义样式会被逐字保留。

对此进行测试,我将 Excel 中的第一个格式字符串更改为 TTTT, TT.MM.JJJJ,并在 Openpyxl 中得到 dddd\\,\\ dd/mm/yyyy

深入挖掘 Excel 生成的 XLSX 文件(只需重命名为 ZIP 并提取)。我最后一个版本的文件styles.xml 是说明性的:

<numFmts count="2">
  <numFmt numFmtId="167" formatCode="mmmm\ yyyy"/>
  <numFmt numFmtId="168" formatCode="dddd\,\ dd/mm/yyyy"/>
</numFmts>

因此,尽管有四种“手动”设置的数字格式,但只有两种创造性的格式字符串才能进入文件。其他格式似乎仅由 ID 引用,因此可以根据应用程序语言环境更改表示形式。更明显的是,Excel 完全自行完成语言环境翻译。将TTTT, TT.MM.JJJJ 翻译成ddddd\, dd/mm/yyyy 使其看起来具有用于常见模式的“智能路径”,即将常用格式交换日期和月份,而用于不常见/自定义格式字符串的智能路径较少。

【讨论】:

  • 好的,这是一个特性,而不是一个错误。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 2017-03-31
  • 2019-11-16
  • 2016-08-17
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多