导入 Excel 数据似乎随机给出空值

Importing Excel Data Seems to Randomly Give Null Values

使用 SSIS for Visual Studio 2017 进行一些 excel 文件导入。

我创建了一个包含多个循环容器的包,这些容器调用特定的包来处理一些文件。我在执行一个特定包时遇到问题,因为它似乎随机决定每个 excel 文件的列数据为 NULL。我 was/am 的印象是这是 TypeGuessRows 的注册表设置的一部分(最初更改为 0 然后更改为 1000 作为测试)位于

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office.0\Access Connectivity Engine\Engines\Excel

之所以这样认为是因为被带入的各种文件一般都是相同的数据,但是好像源数据中前几行列只有数字,混合值的数据会没有被正确带入。除此以外的所有其他专栏似乎都不错。

查看源文件,所有文件都具有相同的数据类型。 我已经尝试更改注册表 TypeGuessRows 值并确保输出列 属性 是基于字符串而不是数字。 连接字符串有 IMEX=1

此问题与用于读取 excel 文件的 OLEDB 提供程序有关:由于 excel 不是每个列都有特定数据类型的数据库,因此 OLEDB 提供程序会尝试识别主要数据在每一列中找到的类型,并替换所有其他无法用 NULL 解析的数据类型。

网上有很多文章讨论了这个问题并提供了几种解决方法(下面列出的链接)

但在使用 SSIS 多年后,我可以说 最佳做法是将 excel 文件转换为 csv 文件并使用平面文件组件读取它们

或者,如果您没有选择将 excel 转换为平面文件,那么您可以强制 excel 连接管理器忽略第一行的 headers 并添加HDR=NO 到连接字符串并添加 IMEX=1 以告诉 OLEDB 提供程序从第一行指定数据类型 (这是 header - 大多数时候都是字符串),在这种情况下,所有列都作为字符串导入,并且没有值被 NULL 替换,但是您将丢失 headers 和一个额外的行(导入 header 行)。

如果您不能忽略 header 行,只需在 [= 之后添加一个包含虚拟字符串值 (示例:aaa 的虚拟行61=] 行并将 IMEX=1 添加到连接字符串。

有用的链接

所以我修复了它。或者至少找到了一个足够的解决方法,可以帮助处于我这种情况的任何人。我认为它与 SSIS 的缓存有关。 我最终在问题列上放置了一个排序函数,因此首先读取由于具有随机数据类型而被读取为 NULL 的记录,而不是被认为是随机的。我会说,我最初尝试过这个但没有用。 通过在同一个包中制作新数据流的小实验,我发现这个解决方案确实有效,因此我认为缓存是问题所在。 如果有人对此有任何疑问,请告诉我。