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

时间:2013-01-30 11:50:41

标签: .net excel csv ssis

Excel中:

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

Column
------
123456
234567
ADCDEF

CSV /文本:

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

Column
------
123456
234567
NULL

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

1 个答案:

答案 0 :(得分:3)

问题是Excel文件包含数值和字符串的混合数据,这导致Excel读取前几行并将列的数据类型推断为数字,在这种情况下不是这样。当您创建 Excel数据源以读取此Excel文件时,您会注意到该列被定义为数字并以此方式对待它。因此字符串永远不会进入输出文件。

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

IMEX代表 intermixed 在此处详细了解:Connection strings for Excel

这是一个说明差异的例子。

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

Excel_1

Excel_2

使用以下连接管理器创建了一个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";

Connections

设计如下所示的数据流,将Excel_1.xls转移到FlatFile_1.csvExcel_2.xls转移到FlatFile_2.csv

Package

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

FlatFile_1

FlatFile_2

您可以右键单击 Excel数据源,然后点击Show Advanced Editor...

Excel data source

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

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

Excel_1 Advanced

您会注意到第二个Excel数据源上的列的数据类型在第一个Excel连接管理器Unicode string [DT_WSTR]上设置为 Excel_2

Excel_2 Advanced

希望有所帮助。