SSIS读取Excel空值问题解决

Posted 詩和遠方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS读取Excel空值问题解决相关的知识,希望对你有一定的参考价值。

SSIS抽Excel数据,遇到一些问题,特将解决办法记录之,一来备忘,二来给广大开发网友提供参考:

数据访问驱动问题

报错:Microsoft.ACE.OLEDB.xxx provider is not registered on the local machine

微软自家产品访问Excel一般都要安装Microsoft.ACE.OLEDB(后面简称为ACE),安装一个正确版本的ACE到SSDT所在的机器上即可。

注意:由于SSDT目前只有32位版本,最好安装32bit的ACE驱动,而且相同版本的驱动或Office软件,要么装32位,要么装64位,无法并存。比如已安装了Office 2016 64 bit,就无法安装ACE16.0 32bit,但可以同时安装ACE 12.0 64bit。

多余空行

用户提供的Excel中间存在空行,或肉眼看上去没有空行,但实际SSIS抽取的数据中最后会有多余空行。

如何去除这些空行呢?方法两有种:

  • SSIS不做任何转换,先将原始数据加载到一个中间表,比如stg_xxx,然后再执行过滤空行的SQL语句,将中间表数据加载到最终表;
  • 在SSIS中用 Conditional Split 组件过滤空行

Excel中有值,但抽出来为NULL

这种情况一般出现在含纯数字文本的列中,Excel默认按前8行数据推测数据类型,若某列前8行数据都是数字,ACE抽出来的数,会认定为Float类型,后续行若与Float类型不兼容,会被自动转为NULL。

避免以上情况也有两种办法:

  • a)更新注册表,将默认8行,改为更大的数,或者0(无限大),同时连接字符串加上IMEX=1
    • 连接字符串示例:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\my_file.xlsx;Extended Properties=“EXCEL 12.0 XML;HDR=YES;IMEX=1”`)
    • 注册表路径:
      • Computer\\HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Office\\14.0\\Access Connectivity Engine\\Engines\\Excel\\TypeGuessRows(32位)
      • HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Office\\14.0\\Access Connectivity Engine\\Engines\\Excel\\TypeGuessRows (64位)
  • b)将Excel中对应列都改为Text类型,而不是General类型
    若没有权限无法更新注册表,就只能更新Excel文件单元格字段属性

总结

用SSIS直接抽取Excel数据真是问题多多,如果可以,还是用平面文件(如CSV)更方便。


参考资料:

  • https://stackoverflow.com/questions/46170343/reading-excel-sheet-using-ace-oledb-12-0-with-imex-1-not-working
  • https://docs.microsoft.com/en-us/sql/integration-services/load-data-to-from-excel-with-ssis?view=sql-server-ver15

以上是关于SSIS读取Excel空值问题解决的主要内容,如果未能解决你的问题,请参考以下文章

C# OLEDB读取EXCEL的数据为空值

SSIS Excel 连接管理器:文件只能在选择了错误的 Excel 版本时才能读取

读取 excel 源代码并根据 ssis 中的标题运行 sp

如何在SSIS中将大型Excel文件拆分为多个小文件?

解决POI读取Excel如何判断行是否为空

ssis 空日期作为空值