输入文件包含如下所示的数据。
Column
------
123456
234567
ADCDEF
输出文件包含如下所示的数据
Column
------
123456
234567
NULL
为了将数据从Excel
传输到CSV
,为什么SSIS包在最后一行写入 NULL 值而不是 ABCDEF ?
答案 0 :(得分:3)
问题是Excel文件包含数值和字符串的混合数据,这导致Excel读取前几行并将列的数据类型推断为数字,在这种情况下不是这样。当您创建 Excel数据源以读取此Excel文件时,您会注意到该列被定义为数字并以此方式对待它。因此字符串永远不会进入输出文件。
您需要修改Excel连接管理器的ConnectionString属性以包含 IMEX=1
,以指示数据源可能包含不同数据类型的值。
IMEX
代表 intermixed
在此处详细了解:Connection strings for Excel
这是一个说明差异的例子。
我根据问题中提供的数据创建了两个相同的Excel文件。
使用以下连接管理器创建了一个SSIS包。
Excel_1 具有以下连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_1.xls;Extended Properties="Excel 8.0;HDR=YES";
Excel_2 具有以下连接字符串。差异是额外的IMEX = 1;。您需要手动将其添加到Excel连接管理器的ConnectionString属性。要查看属性,请单击 Excel连接管理器,然后按 F4 。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_2.xls;Extended Properties="EXCEL 8.0;IMEX=1;HDR=YES";
设计如下所示的数据流,将Excel_1.xls
转移到FlatFile_1.csv
和Excel_2.xls
转移到FlatFile_2.csv
您可以在输出中看到第一个平面文件没有第三行的任何值,但第二个文件没有。原因是第一个Excel连接管理器推断出列类型是数字,这不是真的。但是,第二个文件处理了
您可以右键单击 Excel数据源,然后点击Show Advanced Editor...
在高级编辑器上,单击Input and Output Properties
,展开Excel源输出,然后展开External Columns
。点击Column
。
您会注意到第一个Excel数据源上的列的数据类型在第一个Excel连接管理器double-precision float [DT_R8]
上设置为 Excel_1
您会注意到第二个Excel数据源上的列的数据类型在第一个Excel连接管理器Unicode string [DT_WSTR]
上设置为 Excel_2
希望有所帮助。