Joh*_*tos 6 c# oledb excel import-from-excel
我正在编写一个C#库来读取Excel文件(包括xls和xlsx),我遇到了一个问题.
与此问题中表达的内容完全相同,如果我的Excel文件具有包含字符串值但在第一行中具有数值的列,则OLEDB提供程序假定该列为数字并返回NULL
该列中的值这不是数字.
我知道,正如在提供的答案中,我可以在注册表中进行更改,但由于这是一个我计划在许多机器上使用的库,并且不想更改每个用户的注册表值,我想知道是否存在是一个更好的解决方案
也许是ACE.OLEDB以外的数据库提供程序(似乎JET不再支持得足以被考虑)?
此外,由于这需要在XLS/XLSX上运行,因此EPPlus/XML读取器等选项不适用于xls版本.
您的连接字符串应该如下所示
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcelfile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
Run Code Online (Sandbox Code Playgroud)
连接字符串中的 IMEX=1 是您需要将该列视为混合数据类型的部分。这应该可以正常工作,无需编辑注册表。
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("");
}
}
Run Code Online (Sandbox Code Playgroud)
DbClass 是我为了让生活更轻松而制作的一个简单包装器。在这里能找到它:
http://tech.reboot.pro/showthread.php?tid=4713