我正在尝试从同一列中使用混合格式的excel文件中读取一些数据。 当我使用连接字符串bellow
获取文本格式的值时using (OleDbConnection cn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + physicalPath + "';Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1;TypeGuessRows=0;';"))
它显示“3.2240411747e + 011”作为文字而不是“322404117474”
如何使用正确的数据类型获得正确的值?
答案 0 :(得分:0)
我正在尝试将所有数据读取为字符串,然后将其转换为正确的数据类型。
它显示“3.2240411747e + 011”作为文字而不是“322404117474”
在很大程度上,可以通过构造SQL select语句来格式化ACE提供程序创建的字符串来缓解此问题。在将Double转换为String时,提供程序确定重要数字的方式似乎存在错误。
双人最多可以容纳15位重要人物。值“322404117474”长度为12位,但其字符串表示形式“3.2240411747e + 011”仅有11位数字。我认为正在发生的事情是签名指数占据的四个角色被错误地认为是重要的。这似乎只是具有默认“常规”格式且整数部分长度超过11位的单元格的问题。如果单元格应用了数字格式,则将使用该格式显示的精度。因此,将值作为字符串导入时,应该会导致精度损失。
但是,在我进入SQL语句之前,我想解决在连接字符串的扩展属性部分中包含TypeGuessRows=0
的问题。
简单地说,这是错误的。始终从注册表中读取TypeGuessRows值。有关参数的日期但很好的说明,请参阅:External Data – Mixed Data Types。
您不显示正在使用的SQL语句,但最简单的形式如下:
Select * From [sheetName$]
当尝试将字段值读取为字符串时,此通配符“选择”会出现问题。如果该字段是重新解释为字符串的混合数字/字符串列,则检索到的字符串将根据单元格格式进行格式化。
假设正在检索的工作表如下所示:
第1行,第2行和第4行包含数值。第5行是作为文本输入的数字,第3行显然是文本。当使用上面的SQL(和HDR=NO
)检索它然后显示在DataGridView中时,结果是:
如果需要将它们解析为数字类型,以这种方式检索值格式可能是一个明显的问题。
使用Jet或ACE OleDB提供程序读取Excel文件时,可以在SQL查询中使用MS Access中可用的多个VBA函数。如果在Select语句中使用VBA Format Function,如下所示:
Select F1, Format(F2) As F2 From [sheetName$]
检索到的值如下所示:
当没有指定标题行来提供名称时,提供者会自动分配字段名称“F1”和“F2”。编号顺序从1到表中的列数。