从 Excel 工作表中读取日期时间值

Posted

技术标签:

【中文标题】从 Excel 工作表中读取日期时间值【英文标题】:Reading Datetime value From Excel sheet 【发布时间】:2010-12-27 11:19:42 【问题描述】:

当我试图从 excel 表中读取日期时间类型值时,它返回一个双精度值。例如,如果想像这样读取值 '2007-02-19 14:11:45.730',我得到一个双精度类型值。进一步我正在使用转换这个双精度值时间跨度,但没有成功完成,因为我只得到这个值'2007-02-19 12:00:00 AM' 现在我想要与第一个完全相同的日期时间值。我的代码是这样的:-

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();

请帮忙!!! 谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您也愿意投票赞成答案并将其标记为正确吗? 投票需要 15 个声望,但我只有 6 个,因为我是新用户,但我已将答案标记为正确。 +1 显然,支持投票的限制不应适用于自己的问题。 我明白这一点。只是指出并非所有人都同意您的这种行为是一个错误。 这是我找到的最简单的方法。谢谢。【参考方案2】:

或许您可以尝试使用DateTime.FromOADate 方法在 Excel 和 .net 之间进行转换。

【讨论】:

【参考方案3】:

从 Excel 表中读取日期时间值:试试这个会起作用。

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");

【讨论】:

顺便问一下您的代码与接受的答案有何不同? 投反对票。这是低效的,因为当单元格是日期时,Value2 返回一个装箱的 double 值。【参考方案4】:

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

【讨论】:

【参考方案5】:

或者,如果您的单元格已经是真实日期,只需使用 .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

【讨论】:

我认为它比这更复杂一些。如果您将DateTime 写到ValueValue 将返回DateTime,但如果您将DateTime 写到Value2,则返回double【参考方案6】:

我有类似的情况,我使用下面的代码来完成这个工作..

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]);
        
    

希望这对某些人有所帮助1 thx_joxin

【讨论】:

使用此答案需要 Aspose.Cells 产品的许可证和相关安装。这是一款很棒的产品,但并非所有开发人员都可以使用。【参考方案7】:

您可能想尝试我在另一个 thread 上发布的与从 Excel 表读取日期值相关的简单功能。

它只是将单元格中的文本作为输入并将 DateTime 作为输出。

我很高兴看到为 .Net 开发社区的利益而提供的示例代码有所改进。

这里是线程C# not reading excel date from spreadsheet的链接

【讨论】:

【参考方案8】:

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


public static DateTime? GetAsDateTimeOrDefault(Range cell)

    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    
        return result;
    
    return null;

【讨论】:

以上是关于从 Excel 工作表中读取日期时间值的主要内容,如果未能解决你的问题,请参考以下文章

比较从 Windows 窗体中的 TextBox 获得的日期值与 Excel 表中存储的日期值

在php中将excel日期值读取到m-d-Y

读取 xls,将所有日期转换为正确格式,-> 写入 csv

使用 VBA 在 Excel 中将日期与数据连接日期进行比较

导出具有指定日期格式的 Excel 工作表单元格

如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)