【问题标题】:Reading Datetime value From Excel sheet从 Excel 工作表中读取日期时间值
【发布时间】: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();

请帮忙!!! 谢谢。

【问题讨论】:

    标签: c# excel office-interop


    【解决方案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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-28
            • 2018-04-14
            相关资源
            最近更新 更多