将 VBA 代码应用到来自 SSIS 的 Excel 文件
Apply VBA code to Excel file from SSIS
大家晚上好。
我必须构建一个如下所示的 SSIS 包:
1) 对XLS文件执行VBA代码(将一个范围转置为另一个范围)
2) 保存 XLS(在同一个文件中或作为一个新文件)
3) 从转置范围导入修改后的 XLS。
基本上我必须将数据转置到我必须导入的 XLS 中,但我没有在 SSIS 中找到执行此操作的好方法(因为列范围可以在文件之间更改)
使用这个简单的 VBA 脚本,我可以做到这一点,并让 SSIS 以非常直接的方式读取数据。但是,如果不手动修改 Excel 以添加脚本和 运行 VBA 脚本,我找不到应用此代码的方法。我想自动执行此操作,以便程序包准备 xls、提取新数据并将其保存到 table.
任何人都可以就如何应用此代码或其他方式提出一些想法吗?我认为最重要的一点是它是我想要转置的一个非常具体的范围。
Sub myTranspose()
With Range("a18:ZZ27", Range("a18:ZZ27").End(xlDown))
.Copy
Range("a30").PasteSpecial Transpose:=True
End With
End Sub
创建通过管道传输到数据流任务的脚本任务
通过双击脚本任务并单击“编辑脚本”按钮来编辑脚本任务。
添加对 Excel 和 CSharp 的引用,如
中所示
添加一些类似于以下的代码:
public void Main()
{
string filepath = @"c:\temp\transpose.xlsx";
Excel.Application xlApp;
Excel._Workbook oWB;
try
{
xlApp = new Excel.Application();
xlApp.Visible = false;
oWB = (Excel.Workbook)xlApp.Workbooks.Open(filepath);
Excel.Range fromrng = xlApp.get_Range("B4", "F5");
Object[,] transposedRange = (Object[,])xlApp.WorksheetFunction.Transpose(fromrng);
Excel.Range to_rng = xlApp.get_Range("A8", "A8");
to_rng = to_rng.Resize[transposedRange.GetUpperBound(0), transposedRange.GetUpperBound(1)];
to_rng.Value = transposedRange;
xlApp.ActiveWorkbook.Save();
oWB.Close(filepath);
}
catch (Exception ex)
{
//do something
}
Dts.TaskResult = (int)ScriptResults.Success;
}
这在我创建的示例 transpose.xlsx 中给出了以下结果。
大家晚上好。 我必须构建一个如下所示的 SSIS 包:
1) 对XLS文件执行VBA代码(将一个范围转置为另一个范围) 2) 保存 XLS(在同一个文件中或作为一个新文件) 3) 从转置范围导入修改后的 XLS。
基本上我必须将数据转置到我必须导入的 XLS 中,但我没有在 SSIS 中找到执行此操作的好方法(因为列范围可以在文件之间更改)
使用这个简单的 VBA 脚本,我可以做到这一点,并让 SSIS 以非常直接的方式读取数据。但是,如果不手动修改 Excel 以添加脚本和 运行 VBA 脚本,我找不到应用此代码的方法。我想自动执行此操作,以便程序包准备 xls、提取新数据并将其保存到 table.
任何人都可以就如何应用此代码或其他方式提出一些想法吗?我认为最重要的一点是它是我想要转置的一个非常具体的范围。
Sub myTranspose()
With Range("a18:ZZ27", Range("a18:ZZ27").End(xlDown))
.Copy
Range("a30").PasteSpecial Transpose:=True
End With
End Sub
创建通过管道传输到数据流任务的脚本任务
通过双击脚本任务并单击“编辑脚本”按钮来编辑脚本任务。
添加对 Excel 和 CSharp 的引用,如
中所示
添加一些类似于以下的代码:
public void Main() { string filepath = @"c:\temp\transpose.xlsx"; Excel.Application xlApp; Excel._Workbook oWB; try { xlApp = new Excel.Application(); xlApp.Visible = false; oWB = (Excel.Workbook)xlApp.Workbooks.Open(filepath); Excel.Range fromrng = xlApp.get_Range("B4", "F5"); Object[,] transposedRange = (Object[,])xlApp.WorksheetFunction.Transpose(fromrng); Excel.Range to_rng = xlApp.get_Range("A8", "A8"); to_rng = to_rng.Resize[transposedRange.GetUpperBound(0), transposedRange.GetUpperBound(1)]; to_rng.Value = transposedRange; xlApp.ActiveWorkbook.Save(); oWB.Close(filepath); } catch (Exception ex) { //do something } Dts.TaskResult = (int)ScriptResults.Success; }
这在我创建的示例 transpose.xlsx 中给出了以下结果。