【问题标题】:Read hh:mm:ss in excel file using c#使用 c# 在 excel 文件中读取 hh:mm:ss
【发布时间】:2014-02-18 10:09:18
【问题描述】:

我有一个包含小时:分钟:秒的 excel 文件(例如:12:20:00)
我在自定义类别中设置格式单元格为 hh:mm:ss。
我正在使用 C# 读取此文件中的小时:分钟:秒。
但我收到了一个包含 "12/30/1899 12:20:00"

的字符串

为什么?有人能回答吗?
如何解决这个问题?

我的代码:

string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFileExcelCapture.Text + ";Extended Properties='Excel 8.0;HDR=Yes;'";
using (OleDbConnection connection = new OleDbConnection(con))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
    using (OleDbDataReader rows = command.ExecuteReader())
    {
        while (rows.Read())
        {
            var nameChannel = rows[0];
            string HMS = rows[1].ToString();//Result is "12/30/1899 12:20:00"
        }
    }
}

谢谢
广

【问题讨论】:

  • 您可以使用 split 从这个日期时间字段中获取时间。

标签: c# excel datetime time


【解决方案1】:

我可以使用以下代码解决我的问题

DateTime dt = DateTime.Parse(rows[1].ToString());
string HMS = String.Format("{0:HH:mm:ss}",dt);

但我不明白,
为什么在 excel 文件中包含 C# 中的不同字符串?。

【讨论】:

    【解决方案2】:

    格式 hh:mm:ss 在 excel 中被视为 DateTime 字段,因此当您在 c# 中读取它时,您会得到一个 DateTime 对象而不是字符串。由于 DateTime 对象也有日期,即使没有指定,ToString() 函数也提供完整的日期和时间转换为字符串。试试这个来解决你的问题:

    string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFileExcelCapture.Text + ";Extended Properties='Excel 8.0;HDR=Yes;'";
    using (OleDbConnection connection = new OleDbConnection(con))
    {
        connection.Open();
        OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
        using (OleDbDataReader rows = command.ExecuteReader())
        {
            while (rows.Read())
            {
                var nameChannel = rows[0];
                string HMS = (rows[1] as DateTime).TimeOfDay.ToString();
            }
        }
    } 
    

    【讨论】:

      【解决方案3】:

      使用String.Format 格式化单元格值。当您从 excel 中读取时,它包含 DateTime 值,因此请按照您的要求进行格式化。

      String.Format("HH:mm:ss",cellValue);
      

      在您的情况下,使用如下方式仅从单元格中获取时间部分。

      rows[1].ToString("HH:mm:ss");
      

      【讨论】:

      • 我可以使用以下代码解决我的问题
        DateTime dt = DateTime.Parse(rows[2].ToString()); string HMS = String.Format("{0:HH:mm:ss}",dt);
        但我不明白,为什么excel文件中包含的字符串与C#中的字符串不同?。
      【解决方案4】:

      只添加一个新步骤! 如果您收到“12/30/1899 12:20:00”,则在末尾添加 .Split(' ')[1],这将返回“12:20:00”。

      【讨论】:

        【解决方案5】:

        试试这个:

        double d = double.Parse(workSheet.Cells[1, 1].value(););
        DateTime conv = DateTime.FromOADate(d);
        

        【讨论】:

          【解决方案6】:

          单元格中没有关于日期的信息,所以c#用the day 0填充它

          你应该做的是使用

          String.Format("HH:mm:ss",cellValue);
          

          或

          DateTime time;
          time.TimeOfDay.ToString("HH:mm:ss")
          

          【讨论】:

            【解决方案7】:

            该值被解释为DateTime-Object。简单地解析它并调用datetime.ToLongTimeString()

            你得到一个日期为 1899 年的原因是 C# 将该值解释为时间并将其视为 DateTime 对象。但由于没有保密日期,他尽可能选择最早的日期。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多