我从Excel文件导入数据,我需要检查我导入的数据是TimeSpan还是常规字符串。因为数据可以是 07:00:00 或 D2 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);
}
}
}
正如您所看到的,我试图使用bool来确定导入的字段是否是一个时间跨度。但是布尔总是假的。
任何人都可以帮忙吗?
答案 0 :(得分: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
{
}
TimeSpan
变量ts
。我假设您只是用它来测试它是否可以被解析。相反,您应该使用已解析的TimeSpan
。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
来自评论:
将其转换为double的原因是因为当我导入时 来自我的excel文件的数据,其百分比值为07:00:00女巫 是0,29166666667。所以我将双倍值转换为时间跨度。
但您无法检查TimeSpan
并解析为double
,反之亦然。如果您知道TimeSpan
通过TryParse
直接使用TimeSpan
变量。否则double.TryParse
并在之后使用该变量。
例如:
if(!TruckisValidTimeSpan && TruckisValidDouble)
{
ts = TimeSpan.FromHours(d * 24);
}
答案 1 :(得分:0)
您可以使用正则表达式检查您的值是否为TimeSpan,如下所示:
Regex reg = new Regex("^\d{2}:\d{2}:\d{2}$");
bool TruckIsValid = reg.IsMatch(dtTruck);