我正在创建一个SSIS包,将Excel文件(具有不同的布局)导入到包含150列的SQL Server表中。
SSIS包有一个Foreach循环容器,其中有一个数据流任务,它有一个Excel源组件和一个OLE DB目标组件。
将为每个Excel文件运行数据流任务,因此Excel源组件需要适用于每个文件。
我已经设置了包含长度为255的150个Unicode字符串列的Excel源组件,并且我将ValidateExternalMetadata设置为False,但是我收到错误:在数据源中找不到“列”F143“在包含142列数据的Excel文件上测试包时。
我的问题是:如何让程序包忽略此错误并导入存在的列,还是有另一种方法来处理上述情况?
答案 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文件布局都足够,我重新设计了表格xlRow
,xlColumn
和{{ 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表中。