【问题标题】:Why is the Date in Row being transformed automatically?为什么行中的日期会自动转换?
【发布时间】:2018-12-06 14:08:50
【问题描述】:

我正在使用 Miscrosoft Office Interop Excel 对“.csv”文件进行排序和管理并创建一个 excel 文件。

当我复制一个包含日期的单元格时:

“2018 年 4 月 5 日 18:55”

我把它变成了

“2018 年 4 月 5 日”

并将其粘贴到另一个单元格中,它会将其转换为这个奇怪的数字

43195

为什么会这样?我该如何防止或修改这种情况?我目前正在传递信息。像这样:

String date = worksheet.Cells[1, 1].Value2.ToString();
worksheet.Cells[1, 2].Value2 = date; //this shows up as 43195

【问题讨论】:

  • 因为这显然是1899-12-30 2018 年 4 月 5 日之后的几天(您必须了解一些 Excel 和 Lotus 历史才能了解该开始日期的重要性)。我们需要查看一些代码来修复(或判断是否有什么需要修复)

标签: c# .net excel-interop winforms-interop


【解决方案1】:

它并没有真正改变。 Excel 实际上将所有日期存储为一个数字,表示自 1900 年 1 月 0 日以来的天数(真的!)。您在单元格中看到的是表示日期的原始数值。如果您打开结果电子表格,突出显示您的列,右键单击并选择格式,然后选择“日期”,您会看到它显示您期望的日期。

因此,您将希望在代码中执行此操作。假设您的日期在“B”列中并且您的工作表是“ws”:

ws.Range[“B:B”].NumberFormat = “mm/dd/yyyy”;

这采用美国日期格式。

【讨论】:

  • 不,Excel 的第 0 天是 1899 年 12 月 30 日,而不是 01/01/1900。
  • 您的更正是错误的。真的是搞砸了。 1899 年 12 月 30 日为 0,1899 年 12 月 31 日被赋值为 1,1900 年 1 月 1 日被赋值为 2,依此类推。
  • 已编辑。实际上是 1/0/1900,如果您将 0 格式化为日期,您会看到它。 12 月有 31 天,将 1 格式化为日期会得到“1/1/1900”
  • 对于 en-US 区域设置,Excel 2016,它的作用与我在编辑中描述的完全一样。
  • 我忘了,Excel 为向后兼容做了一些额外的怪事。如果您实际上要说这是自 1900 年 1 月 0 日以来的日子,您还必须说“包括 1900 年 2 月 29 日不存在的一天”。假设您的实际日期都不是从 1900 年或更早,并且您关心 Exel 之外的可重现公式,更容易说它是自 1899/12/30 以来的日子。 (例如它在 COM 中使用的实际值)
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-05-24
  • 2021-08-05
相关资源
最近更新 更多