为什么将数据导出到Excel时日期格式会发生更改?

这是个老生常谈的问题,不过,我把这个答案留在这里,希望它能帮助到别人。

我和你的问题完全一样。在墨西哥,我们使用“日/月/年”日期格式。在Excel和其他信息系统中误解日期是一个非常常见的问题,在将“3/6/2020”(墨西哥符号为6月3日)粘贴到Excel或导出到遗留系统时,将其翻译为“6/3/2020”(3月6日)。

我有一个WPF C#应用程序,它将信息导出到Excel。同样的问题发生在不明确的日期(例如,2020年10月16日,总是被正确地解释为10月16日,因为它不是模棱两可)。我尝试了与您相同的解决方案,创建了一个预先格式化的字符串,然后导出它。然而,结果完全相同。我认为Excel在内部应用的过程与在单元格中键入某项信息时相同,Excel试图确定它是哪种类型的信息(日期、数字、货币等)。因此,通过导出一个字符串,Excel仍然试图理解信息,并计算出它是一个日期,转换成一个日期单元格。

我还注意到,Interop忽略了Windows和Excel区域设置。例如,如果我启动Excel并直接键入“3/6/2020”,该信息将正确地解释为日期和正确日期(2020年6月3日)。但是,通过使用Interop,将“3/6/2020”写入Excel显示为“6/3/2020”;将单元格格式更改为“长日期”显示“2020年3月6日”(当然是西班牙文),因此这不仅是一个表示问题:日期实际上已经更改。很明显,Excel在解释导出日期之后,会在为时已晚时应用区域设置。

我认为“正确”的解决方案是通过Interop命令配置工作簿的区域设置;然而,我找到了两个更快更容易的解决方案。他们俩都能工作。

第一个选项:强制Excel将日期管理为文本字符串

这是快速而肮脏的解决方案。一种非常简单的方法,看起来很愚蠢:只需在字符串的开头添加一个撇号(‘)。是的,我们在Excel中使用的好方法已经用了很久了。

代码语言:javascript运行复制DateTime my_date = DateTime.Today;

string my_string_date = my_date.ToString("dd/mm/yyyy");

string my_fixed_date = "'" + my_string_date;

excelsheet.Cells[1, 1] = my_fixed_date;完成了!Excel将显示与您预期完全相同的日期。但是,此方法有一个缺点:单元格包含文本字符串,而不是日期。更好的解决方案应该将单元格保持为日期;用户可能希望使用公式中的单元格数据作为日期值。

第二个选项(我认为最好的解决方案):用正确的日期格式格式化单元格

在此解决方案中,将导出实际日期变量。但在此之前,单元格的格式是与我们希望显示日期的方式相匹配的日期格式。在这种情况下,我们不需要预先格式化的字符串。

代码语言:javascript运行复制DateTime my_date = DateTime.Today;

excelsheet.Cells[1, 1].NumberFormat = “dd/mm/aaaa”;

excelsheet.Cells[1, 1] = my_date;就这样。在VisualStudio2019中使用WPF C#进行测试,这是可行的。

请注意,我使用的是西班牙日期格式(“dd/mm/aaaa”),因此您可能需要将其更改为Excel区域设置可以理解的字符串。这是解决方案的缺点:它依赖于地区。Excel倾向于将公式和设置转换为区域性语言,这对于普通用户来说非常方便,但对程序员来说却很痛苦。

还请注意,在插入值之前,我正在更改单元格格式。插入日期值后,我尝试应用单元格格式,但没有工作。

这第二种解决方案可以通过找到一种方法来定义单元格格式,以一种独立于地区的方式来改进。如果我找到了办法,我会改变答案的。

Copyright © 2088 霓蓝星游戏活动站_二次元游戏资讯_专属礼包 All Rights Reserved.
友情链接