将 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
  1. 创建通过管道传输到数据流任务的脚本任务

  2. 通过双击脚本任务并单击“编辑脚本”按钮来编辑脚本任务。

  3. 添加对 Excel 和 CSharp 的引用,如

  4. 中所示
  5. 添加一些类似于以下的代码:

    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;
    }
    
  6. 这在我创建的示例 transpose.xlsx 中给出了以下结果。