我的Excel输入文件中有以下行:
Column1 Column2
0-5 3.040
6 2.957
7 2.876
以及使用ADO.NET读取它的以下代码:
string fileName = "input.xls";
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);
var dbConnection = new OleDbConnection(connectionString);
dbConnection.Open();
try
{
var dbCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", dbConnection);
var dbReader = dbCommand.ExecuteReader ();
while (dbReader.Read())
{
string col1 = dbReader.GetValue(0).ToString();
string col2 = dbReader.GetValue(1).ToString();
}
}
finally
{
dbConnection.Close();
}
结果非常令人不安。原因如下:
第一次循环中每列的值:
col1 is empty (blank)
col2 is 3.04016411633586
第二次:
col1 is 6
col2 is 2.95722928448829
第三次:
col1 is 7
col2 is 2.8763272933077
第一次迭代中第一个问题发生在col1上。我希望 0-5 。第二个问题发生在使用col2的每次迭代中,其中ADO.NET显然会在读取值时更改值。如何阻止这种恶意行为?
答案 0 :(得分:4)
默认情况下,ADO.NET根据前8行中的多数类型推断列类型,假设多数类型获胜,如果有多个类型(如果是平局则为数字),并为任何行返回NULL与该列的推断数据类型不匹配。有关此问题的一些注意事项以及如何解决此问题,请参阅here。简而言之:
在连接字符串中添加“IMEX = 1”属性。
在注册表中,设置以下键:
Hkey_Local_Machine / Software / Microsoft / Jet / 4.0 / Engines / Excel / ImportMixedTypes =“Text” Hkey_Local_Machine / Software / Microsoft / Jet / 4.0 / Engines / Excel / TypeGuessRows = 0
这告诉ADO假设一个文本数据类型,如果它无法决定,并扫描前16384行(在以前版本的Excel中,这是所有行......)来推断类型。
答案 1 :(得分:1)
double
类型是大多数数字的近似值,您可以看到col2中近似值的更多小数。只需将其作为double读取并将其转换为小数点后3位数的字符串表示,它们将匹配。
string col1 = dbReader.GetString(0);
var col2Value = dbReader.GetDouble(1);
string col2 = col2Value.ToString("F3");
答案 2 :(得分:1)
尝试做:
string col1 = dbReader.GetString(0);
string col2 = dbReader.GetDecimal(1).ToString();
您可以选择格式化ToString
以适合您的展示方式:
string col2 = dbReader.GetDecimal(1).ToString("0.000");