Excel数据提取 - 列数据类型的问题

Joh*_*tos 6 c# oledb excel import-from-excel

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

此问题中表达的内容完全相同,如果我的Excel文件具有包含字符串值但在第一行中具有数值的列,则OLEDB提供程序假定该列为数字并返回NULL该列中的值这不是数字.

我知道,正如在提供的答案中,我可以在注册表中进行更改,但由于这是一个我计划在许多机器上使用的库,并且不想更改每个用户的注册表值,我想知道是否存在是一个更好的解决方案

也许是ACE.OLEDB以外的数据库提供程序(似乎JET不再支持得足以被考虑)?

此外,由于这需要在XLS/XLSX上运行,因此EPPlus/XML读取器等选项不适用于xls版本.

Cor*_*ory 1

您的连接字符串应该如下所示

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

  • 哈,电脑太疯狂了。您可能没有做错任何事情,也可能存在一些严重的问题,导致您的计算机无法工作,或者我的计算机在没有按键的情况下也无法工作。不管怎样,我希望你能找到解决办法。也许将 Excel 自动化 dll 拉入您的项目并沿着这条路径走下去。 (2认同)