c# - 为什么在使用 OleDb 导入 Excel 时忽略第一个空行

标签 c# .net excel oledb

使用 .Net 的 OleDb,我尝试导入一个 Excel 表,其中第一行可以是空的。我想保留 DataTable 中的空行,以便稍后能够将单元格映射到 Excel 样式的单元格名称“A1、A2、...”。但是无论我做什么,第一行都被删除了。

Excel 文件如下所示:

 -   -   -
 ABC XY  ZZ
 1   2   3
 4   4   5

其中“-”是一个空单元格。 (我对导入格式没有影响。)

简化代码:

        string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"file.xls\";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";
        string mySheet = "Sheet1$";

        OleDbConnection connection = new OleDbConnection(cnnStr);
        DataSet Contents = new DataSet();
        using (OleDbDataAdapter adapter = new OleDbDataAdapter("select * from [" + mySheet + "]", connection))
        {
            adapter.Fill(Contents);
        }

        Console.WriteLine(Contents.Tables[0].Rows.Count); // prints: 3
        Console.WriteLine(Contents.Tables[0].Rows[0].ItemArray[0]); // prints: ABC

知道如何保留那个空行吗?

ps:我找到了How to count empty rows when reading from Excel但无法重现。

最佳答案

该问题似乎与 OLEDB 提供程序的 TypeGuessRows 功能有关。简而言之,Excel 列中的数据可以是任何类型。 OLEDB 提供程序通过扫描工作表的前 8 行来猜测数据类型,以确定多数类型 - 样本中值数量最多的数据类型。任何不属于多数类型的都将被丢弃。

See this blog post for a more detailed explanation.

还有这个MS KB Article讨论行为。

(跳到 TypeGuessRows 行为的解决方法部分)

作为测试,我创建了一个类似于您发布的示例的文件,但将所有列的格式设置为文本并保存了该文件。运行您发布的代码,我能够看到返回了 4 行,第一行是一个空字符串。

您可能还想尝试修改注册表以查看将 TypeGuessRows 设置更改为 0(扫描文件中的所有数据以确定每列的数据类型)是否有助于返回第一个空白行。我的直觉是这不会有帮助。

关于c# - 为什么在使用 OleDb 导入 Excel 时忽略第一个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10010634/

相关文章:

vba - 将excel sumifs公式转换为vba代码

c# - 如何将值设置为二维 Excel 范围?

c# - 在 Windows 10 上将 UWP Geolocation-API 与 Win32-Application 结合使用

c# - xml 根目录中的多个命名空间

.net - mscorlib.dll 中出现“System.BadImageFormatException”

.net - MathML 或 OMML 到 PNG w/.NET?

Excel 2007 - 1004 运行时错误刷新查询表

javascript - 选择选项的一个值后 Controller 响应

c# - MVC 部分 View 中的表单提交

c# - 串口通讯积累了大量正在运行的线程