有没有更好的方法来指出Excel中的“空值”?

我有一个Excel 2007工作簿,其中包含我使用ADO.NET导入到DataTable对象中的数据表。

通过一些实验,我设法find了两种不同的方式来表明一个单元应该被ADO.NET视为“空”:

  1. 这个单元格是完全空白的。
  2. 单元格包含#N/A

不幸的是,这两个都是有问题的:

  1. Excel中的大部分数据列都是通过公式生成的,但在Excel中无法生成公式导致完全空白的单元格。 只有一个完全空白的单元格才会被认为是空的(一个空string将不起作用)。

  2. 任何计算为#N/A公式(无论是由于实际查找错误还是由于使用了NA()函数) 被视为空。 这似乎是理想的解决scheme,直到我发现Excel工作簿必须打开这个工作。 只要closures工作簿,OLEDB就会突然开始将所有#N #N/A作为string。 这会导致填充DataTable时抛出如下exception:

    inputstring的格式不正确。 无法在值列中存储<#N / A>。 预期的types是Int32。

问题:如何通过Excel公式指示空值, 不必在填充DataTable时打开工作簿? 或者可以做些什么来使#N/A值即使在工作簿closures时也被认为是空值?

万一重要,我的连接string是使用以下方法build立的:

 var builder = new OleDbConnectionStringBuilder { Provider = "Microsoft.ACE.OLEDB.12.0", DataSource = _workbookPath }; builder.Add("Extended Properties", "Excel 12.0 Xml;HDR=Yes;IMEX=0"); return builder.ConnectionString; 

_workbookPath是工作簿的完整path)。

我已经尝试IMEX=0IMEX=1但没有区别。

许多非常令人沮丧的Excel用户正在遇到这种情况。 不幸的是,Excel作为一个公司工具很普遍,看起来相当健壮,不幸的是,因为每个单元格/列/行都有一个变体数据types,所以使用其他工具如MySQL,SQL Server,R,RapidMiner,SPSS和名单继续。 看起来,Excel 2007/2010并没有得到很好的支持,在考虑32/64位版本的时候更是如此,这在当今这个时代是令人尴尬的。

主要的问题是,当ACE / Jet访问Excel中的每个字段时,他们使用registry设置“TypeGuessRows”来确定要使用多less行来评估数据types。 “行扫描”的默认值是8行。 registry设置“TypeGuessRows”可以从一(1)到十六(16)行指定一个整数值,也可以指定零(0)来扫描所有现有的行。 如果您无法更改registry设置(例如在90%的办公环境中),则会使生活变得困难,因为猜测的行数限制在前8位。

例如,没有registry更改如果#N / A的第一个出现在前8行内,则IMEX = 1将以string“#N / A”的forms返回错误。 如果IMEX = 0,则#N / A将返回'Null'。

如果#N / A的第一次出现超出前8行,那么IMEX = 0和IMEX = 1都返回'Null'(假定所需的数据types是数字)。

与registry更改(TypeGuessRows = 0),那么一切应该没事。

也许有4个选项:

  1. 更改registry设置TypeGuessRows = 0

  2. 将前8行中所有可能的typesvariables列为“虚拟数据”(例如备注字段/ nchar(max)/ errors#N / A等)

  3. 更正Excel中的所有数据typesexception

  4. 不要使用Excel – 认真值得考虑!

编辑:只是把启动:)另外2件事情真的让我烦恼; 如果工作表上的第一个字段在前8行中是空白的,而您无法编辑registry设置,则整个工作表将返回为空白(许多有趣的对话告诉pipe理员他们是合并单元格的傻瓜!)。 此外,如果在Excel 2007/2010中,如果您有一个部门返回大于255列/字段的工作表,那么如果您需要不连续的导入(例如,第1列中的键和第255+列中的数据)