使用 SSIS 导入空白 Excel 列
Importing blank Excel columns using SSIS
我正在创建一个 SSIS 包以将 Excel 文件(具有不同的布局)导入具有 150 列的 SQL 服务器 table。
SSIS 包有一个 Foreach 循环容器,其中有一个数据流任务,它有一个 Excel 源组件和一个 OLE DB 目标组件。
每个 Excel 文件的数据流任务将为 运行,因此 Excel 源组件需要为每个文件工作。
我已将 Excel 源组件设置为具有 150 个长度为 255 的 Unicode 字符串列,并将 ValidateExternalMetadata 设置为 False,但是我收到错误消息:'Column "F143" cannot be found at the datasource' 当在包含 142 列数据的 Excel 文件上测试包。
我的问题是:如何让程序包忽略此错误并导入存在的列,或者是否有其他方法处理上述情况?
尝试在 Excel source
中使用以下 sql 命令
SELECT * FROM [Sheet1$A1:B]
用 B 代替第 150 列。
为您的 Excel 源代码任务打开编辑器。在左窗格中,select "Error Output"。列窗格下方是一行 "Set this value to selected cells:",旁边有一个下拉菜单。从下拉列表中选择 "Ignore failure"。现在转到列窗格和 select "Error" 列下的所有 150 行,然后点击下拉框旁边的 "Apply"。这应该将所有 Excel 列设置为 "Ignore Error"。点击 "Ok" 然后你就可以开始了。
在Excel源中,select源类型为SQL command
并使用以下命令(假设工作表名称为Sheet1
)
Select * from [Sheet1$A1:ET]
ET
是索引 = 150 的列,因此对于此查询,您将强制 Excel Source
读取第 150 列,即使它们包含一些空列。
有关使用动态 headers 导入 excel 的更多信息,请按照我下面的回答进行操作:
我没有使用具有任意多列的 SQL 服务器 table,希望这足以满足所有可能的 Excel 文件布局,我重新设计了 table 有 xlRow
、xlColumn
和 xlValue
列。
然后我使用脚本组件作为我的数据流的来源,使用以下 C# 代码:
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;
}
}
这会遍历第一个工作表中的每个 non-empty 单元格,并将单元格的行、列和值输出到 Output0
,然后将其插入到 SQL table.
我正在创建一个 SSIS 包以将 Excel 文件(具有不同的布局)导入具有 150 列的 SQL 服务器 table。
SSIS 包有一个 Foreach 循环容器,其中有一个数据流任务,它有一个 Excel 源组件和一个 OLE DB 目标组件。
每个 Excel 文件的数据流任务将为 运行,因此 Excel 源组件需要为每个文件工作。
我已将 Excel 源组件设置为具有 150 个长度为 255 的 Unicode 字符串列,并将 ValidateExternalMetadata 设置为 False,但是我收到错误消息:'Column "F143" cannot be found at the datasource' 当在包含 142 列数据的 Excel 文件上测试包。
我的问题是:如何让程序包忽略此错误并导入存在的列,或者是否有其他方法处理上述情况?
尝试在 Excel source
中使用以下 sql 命令SELECT * FROM [Sheet1$A1:B]
用 B 代替第 150 列。
为您的 Excel 源代码任务打开编辑器。在左窗格中,select "Error Output"。列窗格下方是一行 "Set this value to selected cells:",旁边有一个下拉菜单。从下拉列表中选择 "Ignore failure"。现在转到列窗格和 select "Error" 列下的所有 150 行,然后点击下拉框旁边的 "Apply"。这应该将所有 Excel 列设置为 "Ignore Error"。点击 "Ok" 然后你就可以开始了。
在Excel源中,select源类型为SQL command
并使用以下命令(假设工作表名称为Sheet1
)
Select * from [Sheet1$A1:ET]
ET
是索引 = 150 的列,因此对于此查询,您将强制 Excel Source
读取第 150 列,即使它们包含一些空列。
有关使用动态 headers 导入 excel 的更多信息,请按照我下面的回答进行操作:
我没有使用具有任意多列的 SQL 服务器 table,希望这足以满足所有可能的 Excel 文件布局,我重新设计了 table 有 xlRow
、xlColumn
和 xlValue
列。
然后我使用脚本组件作为我的数据流的来源,使用以下 C# 代码:
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;
}
}
这会遍历第一个工作表中的每个 non-empty 单元格,并将单元格的行、列和值输出到 Output0
,然后将其插入到 SQL table.