【问题标题】:Excel international date formattingExcel 国际日期格式
【发布时间】:2013-11-07 10:15:37
【问题描述】:

我在格式化 Excel 日期时间时遇到问题,以便它可以在国际范围内使用。我们的程序是用 C++ 编写的,并使用 COM 将数据从我们的数据库导出到 Excel,其中包括日期时间字段。

如果我们不提供格式掩码,某些安装的 Excel 会将这些日期显示为序列号(自 1900.01.01 以来的天数,后跟时间为 24 小时小数部分)。这对人类来说是不可读的,所以我们发现我们必须提供一个日期格式掩码以确保它显示可读。

问题 - 如我所见 - 是 Excel 使用国际格式掩码。例如;英国日期时间格式掩码可能是“YYYY-MM-DD HH:MM”。

但是,如果将格式掩码发送到安装在瑞典的 Excel,则会失败,因为瑞典版的 Excel 使用“ÅÅÅÅ-MM-DD tt:mm”。

在我们的应用程序中使用 150 个不同的国家日期时间格式掩码来支持不同的国家/地区是非常不切实际的。

有没有办法编写格式掩码,以便它们包含语言环境,这样我们就可以使用一个单一的掩码?

【问题讨论】:

  • 是否可以询问操作系统或 Excel 应用程序具有的本地化长日期掩码并应用它?
  • 在 Excel 中,您可以访问本地日期格式 NumberFormatLocal 和美国日期格式 NumberFormat。如果您的 C++ 程序可以与 Excel 交互,您可以检查 NumberFormatLocal 中的预设单元格,或者您会以这种方式循环运行吗?
  • 谢谢,我会检查的。但我认为它也是本地化的,所以如果它是美国 Excel,你必须要求“短日期”,但如果它是瑞典 Excel,你必须要求“Kort datum”,否则你会得到一个垃圾答案。到目前为止,这是第 22 条渔获。 :)
  • K_B:我使用 Range->NumberFormat(),但奇怪的是我不能在那里使用美国日期格式(这不是根据文档)。如果我这样做 (PutNumberFormat(L"yyyy-mm-dd")),我将返回日期为“yyyy-57-31”(57 是分钟,31 是天)。 Excel 文档在这方面非常稀疏——它看起来是由某些工具自动生成的。这里有谁知道 NumberFormat 和 NumberFormatLocal 的区别,能解释一下吗??
  • @LasseSL500:您通过 COM 将哪些值放入单元格中?您是使用 Excel 纪元以来的天数,还是将单元格设置为带有日期的字符串?

标签: c++ excel datetime locale


【解决方案1】:

除非您在 Excel 中使用日期功能,否则处理此问题的最简单方法是确定一种格式,然后以该格式自己创建一个字符串并相应地设置单元格。

这部漫画:http://xkcd.com/1179/ 可能会帮助您选择一个标准。否则,在不同国家/地区打开文件的客户将拥有不同格式的数据。只需选择一个标准并强制您的数据符合该标准。

已编辑添加:有些库也可以让您轻松完成此操作...http://www.libxl.com/read-write-excel-date-time.html

编辑添加第 2 部分:基本上我想要达到的目的是避免询问 asmk,而只是自己格式化数据(如果有意义的话)。

【讨论】:

  • 问题实际上不在于格式。 Excel 在解析时使用格式掩码。
  • 对,但是您只是在导出数据,所以这有什么关系,它应该只是一个 fwrite() 到 CSV 文件或类似的东西。这将允许将每个单元格视为一个字符串,并且在 Excel 中打开它看起来都一样...
  • “看”,是的,但这不是一个有用的答案。 Excel一般用于计算,不能对随机字符串进行计算。
  • 所以现在,我真的迷路了,你为什么关心打开的 Excel 文件在显示数据时会是什么样子,如果表示相同?用户始终可以使用“格式化单元格”命令重新格式化单元格。基础数据将保持不变,但担心 ti 由于其本地设置而看起来应该不在您的关注范围内。
  • 假设我想知道我的平均每日收入是多少,这意味着将某个范围内的收入相加并除以时间跨度。该时间跨度是两个日期之间的差异。如果您要将预先格式化的日期字符串导出到 Excel,Excel 无法计算给定两个字符串的时间跨度。
【解决方案2】:

我建议执行以下操作:在特定单元格上创建一个带有日期格式的 Excel,并将其保存以供您的程序使用。

现在,当程序运行时,它会打开它,使用这个 excel 文件从 excel 和指定的单元格中检索本地日期格式。

当您有多种格式要保存时,只需为它们使用不同的单元格。

这不是一个好方法,但可以正常工作。

或者,您可以考虑创建一个 xla(m) 文件,该文件将使用 vba 和一个命令,通过如下函数反馈本地格式字符:

Public Function localChar(charIn As Range) As String
    localChar = charIn.NumberFormatLocal
End Function

这也不是一个非常干净的方法,但它可能对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多