无法从 excel 列中读取字符串值

Posted

技术标签:

【中文标题】无法从 excel 列中读取字符串值【英文标题】:Failing to read String value from an excel column 【发布时间】:2019-11-20 00:09:42 【问题描述】:

SSIS 脚本任务仅读取 excel 的数值,但无法读取同一列中存在的字母数字值

我尝试过使用 IMEX=0、IMEX=1 和 IMEX=2。但是字母数字值在我的 SQL 服务器表中生成为 NULL。

//Excel Connection String
string ConStr;
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + 
";IMEX=0\"";

如果第 8 列“A”值是整数 (0,1,2,3,4,5,6,7),然后在下面的行中出现字母数字 (A,B,ABQX345) 值,那么它应该按原样读取所有值并插入到 SQL Server 表中

0,1,2,3,4,5,6,7,A,B,ABQX345

【问题讨论】:

欢迎来到 ACE 驱动程序的(可怕的)世界,他们并不关心您的数据类型到底是什么,无论您喜欢与否,它都会错误地推断出来(我意识到这一点不是建设性评论)。 出于兴趣,您为什么要在控制流中使用脚本任务来读取 excel 文件?通常,您在数据流中读取此类内容,并且会使用 Excel 连接管理器和 Excel 源。 excel文件中的第一个值必须是字符串 【参考方案1】:

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

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

但是在使用 SSIS 多年之后,我可以说最佳实践是将 excel 文件转换为 csv 文件并使用 Flat File 组件读取它们

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

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

SchemaMapper Excel 导入类

此外,最好检查以下属于 SchemaMapper 项目的类,我实现了上述逻辑以解决此问题:

SchemaMapper - MsExcelImport.cs

有用的链接

SSIS Excel Data Import - Mixed data type in Rows Mixed data types in Excel column Importing data from Excel having Mixed Data Types in a column (SSIS) Why SSIS always gets Excel data types wrong, and how to fix it! EXCEL IN SSIS: FIXING THE WRONG DATA TYPES IMEX= 1 extended properties in ssis

【讨论】:

我从未见过 HDR=NO 来获得所有字符串的技巧 (+1)。我只是讨厌 Excel 资源,因为我知道有人制作/触摸过它/对它做了一些事情(例如,截断前导 0)并且它也会有其他错误。

以上是关于无法从 excel 列中读取字符串值的主要内容,如果未能解决你的问题,请参考以下文章

从 excel/文本文件中读取而不跳过空格,除非由选项卡制作

如何有效地从大型 Excel 文档中检索所有字符串

Excel - 需要从数组中搜索列表单元格的子字符串,无法获得索引/匹配工作吗?

Excel VBA:从一列中的字符串中查找和删除多个值

无法从 C# 中的 excel 文件中读取数值

Python Pandas - 如何在 Excel 工作表的特定列中写入