为什么在将数据从Excel传输到CSV时,SSIS将最后一行保存为NULL?

Excel中:

input文件包含如下所示的数据。

Column ------ 123456 234567 ADCDEF 

CSV /文字:

输出文件包含如下所示的数据

 Column ------ 123456 234567 NULL 

为什么在将数据从Excel传输到CSV时,SSIS包在最后一行写入NULL值而不是ABCDEF

问题是,Excel文件包含数值和string的混合数据,这会导致Excel读取前几行并将数据types推断为数字,在这种情况下不是这样。 当您创buildExcel数据源来读取此Excel文件时,您会注意到该列被定义为数字并以此方式处理。 因此,string永远不会输出到输出文件。

您需要修改Excel连接pipe理器的ConnectionString属性以包含IMEX=1以指示数据源可能包含不同数据types的值。

IMEX代表intermixed阅读更多关于它在这里: Excel的连接string

这里是一个例子来说明不同之处。

我根据问题中提供的数据创build了两个相同的Excel文件。

Excel_1

Excel_2

创build一个SSIS包与以下连接pipe理器。

Excel_1有以下连接string

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_1.xls;Extended Properties="Excel 8.0;HDR=YES"; 

Excel_2有以下连接string。 不同的是额外的IMEX = 1 ;. 您需要手动将其添加到Excel连接pipe理器的ConnectionString属性。 要查看属性,请单击Excel连接pipe理器 ,然后按F4键。

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_2.xls;Extended Properties="EXCEL 8.0;IMEX=1;HDR=YES"; 

连接

devise数据stream如下所示将Excel_1.xls传输到FlatFile_1.csvExcel_2.xlsFlatFile_2.csv

包

您可以在输出中看到第一个平面文件没有第三行的任何值,但是第二个文件没有。 原因是第一个Excel连接pipe理器推断列types是数字的,这是不正确的。 但是,第二个文件处理了

FlatFile_1

FlatFile_2

您可以右键单击Excel数据源并单击Show Advanced Editor...

Excel数据源

在高级编辑器上,单击Input and Output Properties ,展开Excel源输出,然后展开External Columns 。 点击Column

您会注意到,第一个Excel数据源上的列的数据types在第一个Excel连接pipe理器Excel_1上设置为double-precision float [DT_R8]

Excel_1高级

您将注意到第二个Excel数据源Excel_2的数据types被设置为第一个Excel连接pipe理器Excel_2上的Unicode string [DT_WSTR]

Excel_2高级

希望有所帮助。