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空值问题解决的主要内容,如果未能解决你的问题,请参考以下文章
SSIS Excel 连接管理器:文件只能在选择了错误的 Excel 版本时才能读取