0

我正在从 Excel 文件中导入数据,我需要检查我正在导入的数据是 TimeSpan 还是常规字符串。因为数据可以是07:00:00D2 07:00。在 excel 文件中,一些字段被格式化为tt:mm,但其他字段是纯文本字段。

我的代码如下所示:

 public void ReadExcelFile()
        {
            string filename = @"C:\Temp\Copy2.xlsx";
            using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""))
            {
                try
                {
                    connection.Open();
                    string sqlCmd1 = "SELECT  * FROM [Sheet1$]";
                    using (OleDbCommand command = new OleDbCommand(sqlCmd1, connection))
                    {
                        command.CommandType = System.Data.CommandType.Text;
                        using (OleDbDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                alias = "" + reader[3];
                                codeT = "" + reader[4];
                                dtTruck = "" + reader[5];
                                codeP = "" + reader[6];
                                dtPlane = "" + reader[7];
                                dtDealer = "" + reader[8];

                                TimeSpan ts;
                                bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
                                bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
                                if (TruckisValid )
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                }
                                else if (PlaneisValid)
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                }
                                else
                                {

                                }

                                if (dtTruck == "" && dtPlane == "")
                                {
                                    dtTruck = "";
                                    dtPlane = "";
                                }
                                else if (dtTruck != "")
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                    dtPlane = "";
                                }
                                else if (dtPlane != "")
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                    dtTruck = "";
                                }


                                SearchForAdrIDAndCustID(Convert.ToString(reader[0]), Convert.ToString(reader[3]));
                                InsertData(custID, "" + reader[3], adrID, truck, codeT, plane, codeP, dtDealer);
                            }
                        }
                    }

                }
                catch (Exception exception)
                {
                    Console.WriteLine("ERROR in ReadExcelFile() method. Error Message : " + exception.Message);
                }
            }
        }

如您所见,我尝试使用布尔值来确定导入的字段是否为时间跨度。但是布尔值总是错误的。

谁能帮忙?

4

2 回答 2

2

这是您问题的相关部分:

TimeSpan ts;
bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
if (TruckisValid )
{
    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
}
else if (PlaneisValid)
{
    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
}
else
{

}
  1. 您正在为两个不同的字段重用相同的TimeSpan变量ts。我假设您使用它只是为了测试它是否可以被解析。相反,您应该使用已解析的TimeSpan.
  2. 您正在测试,TimeSpan您正在将其转换为double. 它既可以转换为 TimeSpan,也可以转换为双倍,而不是两者。

所以也许这种方法更好:

double d;
TimeSpan ts;
bool TruckisValidDouble = false;
bool TruckisValidTimeSpan = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
if(!TruckisValidTimeSpan)
{
    TruckisValidDouble = double.TryParse(dtTruck, out d);
}
// use approapriate variables

来自评论:

将其转换为双倍的原因是因为当我从我的 excel 文件中导入数据时,它的百分比值为 07:00:00,女巫为 0,29166666667。所以我将双精度值转换为时间跨度。

但是您不能检查TimeSpan并解析为,double反之亦然。如果您知道它是TimeSpan通过直接TryParse使用TimeSpan变量。否则double.TryParse,然后使用该变量。

例如:

if(!TruckisValidTimeSpan  && TruckisValidDouble)
{
    ts = TimeSpan.FromHours(d * 24);
}
于 2012-11-20T09:35:21.060 回答
0

您可以使用正则表达式来检查您的值是否是 TimeSpan ,如下所示:

Regex reg = new Regex("^\d{2}:\d{2}:\d{2}$"); 
bool TruckIsValid = reg.IsMatch(dtTruck);
于 2012-11-20T09:34:47.693 回答