SSIS导入特定Excel文件时Card Number字段值变为NULL的排查求助
排查思路与解决方案
1. 排查ACE驱动的类型推断逻辑
ACE OLEDB驱动默认会采样前8行数据推断列的类型,如果这份异常文件的Card Number列前8行里,无绿色标记的纯数值单元格占多数,驱动会把列类型判定为数值型,后面带撇号/文本格式的数字就会被识别为无效值,返回NULL。
- 实操:打开异常文件,对比正常文件的前10行
Card Number列格式差异;临时把异常文件前几行的纯数值单元格改成带撇号的文本格式,重新导入测试。
2. 修改连接字符串强制按文本读取
在Excel连接字符串的Extended Properties中添加IMEX=1参数,强制驱动将混合类型列按文本处理,避免类型推断导致的NULL。修改后的连接字符串:
Provider=Microsoft.ACE.OLEDB.16.0;Data Source=\removed\source\file.xlsx;Extended Properties="EXCEL 12.0 XML;HDR=YES;IMEX=1";
注意:要让
IMEX=1生效,需修改注册表:在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel路径下,把TypeGuessRows值设为0(采样所有行)或足够大的数值,否则驱动仍会优先采样前N行推断类型。
3. 检查单元格底层存储细节
有些单元格显示为General格式,但底层存储类型可能有差异:
- 选中
Card Number列,通过Excel的「公式→名称管理器」新建名称CheckType,引用公式=TYPE(A2)(假设A列为目标列),下拉填充后查看返回值:1代表数值型,2代表文本型,对比正常文件的类型分布。 - 排查是否存在隐藏字符,用
TRIM()或CLEAN()函数清理后再导入测试。
4. 调整SSIS Excel源配置
- 在SSIS Excel源编辑器的「高级」选项中,确认
Card Number列的输出类型为DT_WSTR,如果驱动推断为数值型(比如DT_R8),手动修改为DT_WSTR。 - 若仍无效,添加脚本组件手动读取单元格文本内容,绕过驱动的类型推断逻辑。
5. 验证文件导出的一致性
即便来源声称导出方式一致,仍需确认:
- 导出时
Card Number列的格式是否被意外修改(比如从文本改为数值)。 - 用Excel的「另存为」功能重新保存异常文件为XLSX,再尝试导入(可能存在文件损坏或格式元数据异常)
内容的提问来源于stack exchange,提问作者JetRocket11
相关产品推荐
相关产品推荐

