首页 > 解决方案 > 无法从 excel 列中读取字符串值

问题描述

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

标签: c#sql-serverexcelssisscript-task

解决方案


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

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

但是在使用 SSIS 多年之后,我可以说最好的做法是将 excel 文件转换为 csv 文件并使用 Flat File components 读取它们

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

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

SchemaMapper Excel 导入类

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

有用的网址


推荐阅读