如何防止ADO.NET从Excel文件读取时更改双精度值

我在Excelinput文件中有以下几行:

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在读取它们时显然会改变它们的值。 如何阻止这种不良行为?

默认情况下,ADO.NET根据前8行中的多数types推断列types,如果存在多个types(如果是平局,则为数字)假设多数types为赢,并且对于任何不匹配的行返回NULL其推断的数据types为该列。 看到这里有关于这个和如何解决它的一些说明。 简而言之:

  • 为连接string添加“IMEX = 1”属性。

  • 在registry中,设置以下键:

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假设它不能决定的文本数据types,并扫描前16384行(在以前的Excel版本中,这是所有行…)推断types。

doubletypes是大多数数字的近似值,并且您在col2中会看到近似值的更多小数。 简单地读取它作为双精度,并将其转换为小数点后3位数的string表示forms,它们将匹配。

 string col1 = dbReader.GetString(0); var col2Value = dbReader.GetDouble(1); string col2 = col2Value.ToString("F3"); 

尝试做:

 string col1 = dbReader.GetString(0); string col2 = dbReader.GetDecimal(1).ToString(); 

或者,您可以格式化ToString以适应您的喜好:

 string col2 = dbReader.GetDecimal(1).ToString("0.000");