Excel数据提取 – 发布列数据types

我正在写一个C#库来读取Excel文件(xls和xlsx),我遇到了一个问题。

与此问题中所expression的内容完全相同,如果我的Excel文件的列有string值,但在第一行有一个数字值,则OLEDB提供程序将该列假设为数字,并返回NULL不是数字的列。

我知道,正如在提供的答案 ,我可以在registry中进行更改,但由于这是一个图书馆,我打算在许多机器上使用,并不想改变每个用户的registry值,我想知道如果有是更好的解决scheme。

也许除了ACE.OLEDB以外的数据库提供者(似乎JET已经不再被支持,不足以被考虑)?

另外,由于这需要在XLS / XLSX上运行,所以诸如EPPlus / XML阅读器之类的选项将不适用于xls版本。

你的连接string应该像这样

 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcelfile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"; 

连接string中的IMEX = 1是您需要将该列作为混合数据types处理的部分。 这应该工作正常,而不需要编辑registry。

HDR = Yes只是将第一行标记为列标题,并不是特定问题中需要的,但是我已经将其包含在内。

总是使用IMEX = 1是一种更安全的方式来检索混合数据列的数据。

来源: https : //www.connectionstrings.com/excel/

编辑:

这是我正在使用的数据:

数据

这是输出:

在这里输入图像说明

这是我使用的确切代码:

 string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"""; using (DbClass db = new DbClass(connString)) { var x = db.dataReader("SELECT * FROM [Sheet1$]"); while (x.Read()) { for (int i = 0; i < x.FieldCount; i++) Console.Write(x[i] + "\t"); Console.WriteLine(""); } } 

DbClass是我为了简化生活而做的一个简单的包装。 在这里能find它:

http://tech.reboot.pro/showthread.php?tid=4713