从Excel工作表读取Datetime值


87

当我试图从Excel工作表中读取datetime类型值时,它返回一个double值。例如,如果要读取这样的值'2007-02-19 14:11:45.730',我将获得double类型值。此外,我正在使用时间跨度转换此double值,但未成功完成因为我现在只获得此值,所以'2007-02-19 12:00:00 AM'
我想要与第一个完全相同的datetime值。我的代码就像:-

TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);

  DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);

   arrrow2[cCnt - 1] = inputdate.ToString();

请帮忙!!!谢谢。

Answers:


222

您需要通过使用DateTime.FromOADate将日期格式从OLE自动化转换为.net格式。

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

1
您还可以投票赞成答案并将其标记为正确吗?
Mikael Svenson 2010年

投票需要15个声望,但是作为新用户,我只有6个声望,但是我将答案标记为正确。
普拉纳夫

4
+1显然,投票的限制不适用于自己的问题。
Mike Rosenblum

1
我明白。只是指出并非所有人都会同意您的这种行为是一个错误。
jwg

1
这是我找到的最简单的方法。谢谢。
Ashok


6

从Excel工作表中读取Datetime值:尝试此操作即可。

string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();

double date = double.Parse(sDate);

var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");

4
顺便问一下,您的代码与接受的答案有何不同?
普拉纳夫2014年

不赞成投票。这效率低下,导致当单元格为日期时,Value2返回一个装箱的double值。
dbardakov '19

0

或者您可以简单地使用OleDbDataAdapter从Excel获取数据


0

或者,如果您的单元格已经是真实日期,则只需使用.Value而不是.Value2:

excelApp.Range[namedRange].Value
{21/02/2013 00:00:00}
    Date: {21/02/2013 00:00:00}
    Day: 21
    DayOfWeek: Thursday
    DayOfYear: 52
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 634970016000000000
    TimeOfDay: {00:00:00}
    Year: 2013

excelApp.Range[namedRange].Value2
41326.0

1
我认为这要复杂得多。如果您将写入到,Value则将返回,但如果您将写入到,则将返回。DateTimeDateTimeValuedoubleDateTimeValue2
jwg 2013年

0

我有类似的情况,我用下面的代码来使它工作。

Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);

Workbook workbook = new Workbook(fstream, loadOptions);

Worksheet worksheet = workbook.Worksheets[0];

dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);

DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();

foreach (DataColumn column in dtCloned.Columns)
{
    if (column.DataType == Type.GetType("System.DateTime"))
    {
        column.DataType = typeof(String);
        myAL.Add(column.ColumnName);
    }
}


foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}



foreach (string colName in myAL)
{
    dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
}


/*******************************/

public static class MyExtension
{
    public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
    {
        foreach (DataRow row in column.Table.Rows)
        {
            row[column] = conversion(row[column]);
        }
    }
}

希望这对您有所帮助


2
使用此答案需要Aspose.Cells产品的许可证和相关的安装。这是一个很棒的产品,但不是所有开发人员都可以使用的产品。
扎里菲斯2014年


0

另一个选择:当在编译时未知单元格类型并且单元格格式化为Date时,Range.Value返回所需的DateTime对象。


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.