C#excel互操作:DateTime值的写入不一致

本文关键字:不一致 互操作 DateTime C#excel | 更新日期: 2023-09-27 18:24:08

我正在尝试使用interop创建excel电子表格。其中一列是日期/时间列,我强加给数据的格式没有反映在电子表格中。

if (dt.Rows[i][col] is DateTime)
{
    var tmp = (DateTime)dt.Rows[i][col];
    val = tmp.ToString("dd/MM/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
}
cell.Value = val; // cell is a range object...set the cell's Value property 

电子表格中的一些数据的格式为30/05/2004 21:59:23(正确),但其他数据的格式则为1/6/2004 4:18:35 AM(为什么月份/日期不正确…为什么是AM/PM?)。我每次都尝试创建新的DateTime对象(只提取电子表格的相关属性),但都没有成功。

为什么不尊重字符串格式?

C#excel互操作:DateTime值的写入不一致

通过分配给属性Value,您只提供了值,而没有提供格式。在某些情况下,Excel可能会同意您提供的实际格式,而在其他情况下则不然。

如果格式很重要,我建议将Value写成DateTime,并使用单元格的NumberFormat属性来定义格式。

如果你提供了一个明确的格式,我会尽可能坚持系统格式而不是自定义格式。通常这样可以避免用户的烦恼。

我猜Excel正在使用默认格式(mm/dd/yyyy)将字符串转换为日期值。由于30/05/2004 21:59:23不是该格式的有效日期,因此将其保留为字符串。

我建议使用数字值代替字符串作为日期,并让Excel格式化它们(或以编程方式更新日期格式):

var tmp = (DateTime)dt.Rows[i][col];
val = tmp.ToOADate();