通过OleDB读取Excel文件时,DBNull在非空单元格中

时间:2010-07-08 18:48:18

标签: c# excel oledb dbnull

我使用OleDB读取Excel文件。其中一列具有“通用”格式,并且包含字母和值仅由数字组成的字符串。检索字符串值没有问题,但纯数值被检索为DBNull

如何解决?

我使用以下连接字符串打开 Excel 2003文件(xls):

"Provider=Microsoft.Jet.OLEDB.4.0;
 Data Source=C:\\file.xls;
 Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""

2 个答案:

答案 0 :(得分:6)

我在微软的网站上找到了适用于您的方案的一些文档。他们建议将所有数字转换为字符串。

http://support.microsoft.com/kb/257819

如前所述,ADO必须猜测Excel工作表或范围中每列的数据类型。 (这不受Excel单元格格式设置的影响。)如果在同一列中将数值与文本值混合,则可能会出现严重问题。 Jet和ODBC提供程序都返回多数类型的数据,但返回少数数据类型的NULL(空)值。如果列中的两种类型同等混合,则提供者会选择数字而不是文本。

例如:

* In your eight (8) scanned rows, if the column contains five (5) numeric values and three (3) text values, the provider returns five (5) numbers and three (3) null values.
* In your eight (8) scanned rows, if the column contains three (3) numeric values and five (5) text values, the provider returns three (3) null values and five (5) text values.
* In your eight (8) scanned rows, if the column contains four (4) numeric values and four (4) text values, the provider returns four (4) numbers and four (4) null values.

答案 1 :(得分:1)

我有同样的问题,但有字符串值。返回数值,但字符串值返回NULL。我想将数值加载为字符串值。该列可以包含数字和非数字代码(例如:100344567和PRD001X01)。

Excel驱动程序认为该列的类型为numeric,因为前8行中的值是numeric类型。

即使我将单元格定义为文本(格式单元格),它也不起作用。

要强制驱动程序将列“看到”为字符串,我只需在数值前面加上引号('100344567)。这会将数值转换为字符串。

此值为8行在注册表HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ - > TypeGuessRows = 8中定义。

我希望它会有所帮助。