使用SSIS导入空白Excel列

时间:2017-12-08 16:58:07

标签: sql-server excel ssis etl

我正在创建一个SSIS包,将Excel文件(具有不同的布局)导入到包含150列的SQL Server表中。

SSIS包有一个Foreach循环容器,其中有一个数据流任务,它有一个Excel源组件和一个OLE DB目标组件。

将为每个Excel文件运行数据流任务,因此Excel源组件需要适用于每个文件。

我已经设置了包含长度为255的150个Unicode字符串列的Excel源组件,并且我将ValidateExternalMetadata设置为False,但是我收到错误:在数据源中找不到“列”F143“在包含142列数据的Excel文件上测试包时。

我的问题是:如何让程序包忽略此错误并导入存在的列,还是有另一种方法来处理上述情况?

4 个答案:

答案 0 :(得分:0)

尝试在Excel源代码中使用以下sql命令

SELECT * FROM [Sheet1$A1:B] 

替换第150列的任何内容。

答案 1 :(得分:0)

打开Excel Source任务的编辑器。在左侧窗格中,选择"错误输出"。在列窗格下方是一行"将此值设置为选定的单元格:"旁边有一个下拉菜单。选择"忽略失败"从下拉。现在转到列窗格并选择"错误"下的所有150行。列,然后点击"应用"但是在下拉框旁边。这应该将所有Excel列设置为"忽略错误"。点击"确定"然后你应该好好去。

答案 2 :(得分:0)

在Excel源中,选择源类型为SQL command并使用以下命令(假设工作表名称为Sheet1

Select * from [Sheet1$A1:ET]

ET是index = 150的列,因此对于此查询,您强制Excel Source读取150列,即使它们包含一些空列。

有关使用动态标头导入Excel的其他信息,请按照以下答案操作:

答案 3 :(得分:0)

我没有使用任意多列的SQL Server表,希望这对所有可能的Excel文件布局都足够,我重新设计了表格xlRowxlColumn和{{ 1}}列。

然后我使用脚本组件作为我的数据流的源,使用以下C#代码:

xlValue

循环遍历第一个工作表中的每个非空单元格,并将单元格的行,列和值输出到 Excel.Application xlApp = new Excel.Application(); xlApp.Visible = false; xlApp.DisplayAlerts = false; Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(filename, Password: "'"); Excel.Worksheet xlWorkSheet = xlWorkBook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet; Excel.Range UsedRange = xlWorkSheet.UsedRange; foreach (Excel.Range c in UsedRange) { string val = Convert.ToString(c.Value2); if (val != "" && val != null) { Output0Buffer.AddRow(); Output0Buffer.Row = c.Row; Output0Buffer.Column = c.Column; Output0Buffer.Value = val; } } ,然后将其插入到SQL表中。