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

6
我正在编写一个C#库来读取Excel文件(xls和xlsx),但我遇到了一个问题。
此问题中表达的一样,如果我的Excel文件有一个包含字符串值但第一行为数字值的列,则OLEDB提供程序会将该列视为数字并返回该列中不是数字的 NULL 值。
我知道,如所提供的答案,我可以在注册表中进行更改,但由于这是一个我计划在许多机器上使用的库,并且不想更改每个用户的注册表值,因此我想知道是否有更好的解决方案。
也许有其他DB提供程序可用,而不是ACE.OLEDB(似乎JET已经不再得到足够支持以被考虑)?
另外,由于需要在XLS / XLSX上工作,因此诸如EPPlus / XML读取器之类的选项不适用于xls版本。

我目前解决这个问题的方法是使用Excel COM接口和一些C#代码,打开文件并将其另存为.csv文件。我还有一个宏,用于整理数据,但这种方法会删除所有格式,并允许更轻松的导入。 - AeroX
谢谢,@AeroX,我也在考虑这个问题,但是如果可能的话,我想尽量避免使用Interop,因为那会引起很多其他问题 :) ... 我希望有人能提供另外的解决方案,但还是非常感谢你分享你的方法!! - John Bustos
请使用OpenXml SDK。 - andrei.ciprian
@andrei.ciprian,这个问题只适用于xlsx,不适用于xls,对吗? - John Bustos
1个回答

1

你的连接字符串应该是这样的

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

连接字符串中的IMEX=1是您需要将列处理为混合数据类型的部分。这应该可以正常工作,无需编辑注册表。

HDR=Yes只是将第一行标记为列标题,并不需要在您的特定问题中使用,但我仍然包含了它。

始终使用IMEX=1是检索混合数据列的更安全的方法。

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

编辑:

这是我正在使用的数据:

data

这里是输出内容:

enter image description here

这是我使用的准确代码:

This is the exact code I used:

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是我为了让生活更轻松而制作的简单包装器。它可以在这里找到:

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


很遗憾,Kobe,我在网上找到了这个方法,它似乎是有道理的:在连接字符串的扩展属性部分设置“IMEX=1”。这将强制执行ImportMixedTypes=Text注册表设置。您还可以通过将[HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes]更改为数字来更改类型的强制执行方式。基本上,IMEX=1强制执行注册表设置,但本身并不足够好。 - John Bustos
我添加了我用来测试的精确代码。你能提供一下你找到它的链接吗? 另外,我没有那些注册表设置,无论是 JET 还是 ACE。因此,我不明白这怎么可能。 - Cory
感谢更新,@KoBe - 你确定没有设置注册表键吗?我正在尝试,但仍然无法获取返回的数据...你肯定有一列以数字开头(并且大多数由数字组成),其中还有字符串,并且你也能得到字符串值吗? - John Bustos
1
又更新了帖子。我确定了。我已经检查过Wow6432Node。你要查看的路径是什么?你是x64还是x86? - Cory
2
哈,电脑真是疯狂。你可能没有做错任何事情,也可能存在一些奇怪的问题,导致你的电脑无法工作,或者我的电脑可以在没有按键的情况下运行。不管怎样,我希望你能找到解决方案。也许将Excel自动化dll文件引入你的项目并走这条路线会有所帮助。 - Cory
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接