C# 如何读取混合数据类型的excel?

C# 如何读取混合数据类型的excel?,c#,.net,C#,.net,我正在尝试从excel文件中读取同一列中混合格式的数据。 当我用下面的连接字符串获取文本格式的值时 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.2240

我正在尝试从excel文件中读取同一列中混合格式的数据。 当我用下面的连接字符串获取文本格式的值时

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”

如何使用正确的数据类型获取正确的值

我试图将所有数据读取为字符串,然后将其转换为正确的数据类型

它将“3.2240411747e+011”显示为文本,而不是“322404117474”

在很大程度上,可以通过构造SQL select语句来格式化ACE提供程序创建的字符串来缓解此问题。当提供程序将Double转换为字符串时,它确定有效数字的方式似乎存在错误

一个双人床最多可以容纳15位有效数字。值“322404117474”的长度为12位,但其字符串表示形式“3.2240411747e+011”只有11位。我认为正在发生的是,有符号指数占据的四个字符的位置被错误地认为是重要的。这似乎只是具有默认“常规”格式且整数部分长度超过11位的单元格的问题。如果单元格应用了数字格式,则将使用该格式显示的精度。因此,在将值作为字符串导入时,您应该预计会丢失准确性

但是,在进入SQL语句之前,我想解决连接字符串的扩展属性部分中包含的
TypeGuessRows=0

简言之,这是错误的。TypeGuessRows值始终从注册表读取。有关参数的已注明日期但良好的说明,请参阅:

您不显示正在使用的SQL语句,但它的最简单形式如下所示:

Select * From [sheetName$]
尝试将字段值读取为字符串时,此通配符“Select”有问题。如果字段是重新解释为字符串的混合数字/字符串列,则检索到的字符串将根据单元格格式设置格式

假设正在检索的工作表如下所示:

Select F1, Format(F2) As F2 From [sheetName$]

第1、2和4行包含数值。第5行是作为文本输入的数字,第3行显然是文本。当使用上述SQL(以及
HDR=NO
)检索并显示在DataGridView中时,结果为:

如果需要将值解析回数字类型,那么以这种方式检索值格式可能是一个明显的问题

使用Jet或ACE OleDB提供程序读取Excel文件时,可以在SQL查询中使用MS Access中提供的多个VBA函数。如果在Select语句中使用,如下所示:

Select F1, Format(F2) As F2 From [sheetName$]
检索到的值如下所示:

Select F1, Format(F2) As F2 From [sheetName$]


当没有指定标题行来提供字段名时,提供程序会自动分配字段名“F1”和“F2”。编号顺序是从1到表中的列数。

我个人的建议是使用“真正的”Excel库,而不是OleDb不可靠的Excel支持。我个人喜欢,但是有很多可用的。因为这可能不是你想要的答案,我将把它作为评论而不是答案。我还建议使用“真正的库”,有一个非常好的“内置”库:看看这个答案——据我所知,TypeGuessRows只是一个注册表设置,对连接字符串没有任何影响:这里还说IMEX=1将所有混合数据视为文本。你的目标是什么?一开始,您暗示您希望以值的字符串表示形式检索所有值,但对表示形式的默认格式不满意。然后您会说:
我如何才能用正确的数据类型获得正确的值?
这是一个完全不同的目标。这两个目标都可以实现。嗨,海因茨,谢谢你的回复。我认为Excel库代替OleDb会在100000或200000行(20到50列)的情况下消耗大量内存。我说得对吗?