首页 > 解决方案 > 如何确保 Microsoft.Interop.Excel.Workbook.SaveAs 使用 SSIS 变量以正确的文件名保存文本文件?

问题描述

我在我的 SSIS 包的脚本任务中使用 Microsoft.Interop.Excel 库。脚本任务放置在 For Each 循环容器中,该容器使用文件枚举器集合来迭代给定文件夹中所有后缀为 .xlsx 的文件。

脚本任务运行没有问题,并按预期生成文本文件。但是,文本文件的名称应该从我传递给脚本任务的变量中获得,例如 MyTextFile.txt。相反,脚本任务会创建将其命名为 MyExcelFile.xlsx_MyTextFile.txt 的文本文件。预期的结果是创建一个名为 MyTextFile.txt 的文本文件。

我的脚本任务的内容如下:

    Using Excel = Microsoft.Interop.Excel;
    public void Main()
    {
        try {
            Excel.Application app = new Excel.Application();
            app.DisplayAlerts = false;
            Excel.Workbooks workbooks = app.Workbooks;
            Excel.Workbook workbook = workbooks.Open(Dts.Variables["User::Filename"].Value.ToString());
            Excel.Sheets worksheets = (Excel.Sheets)workbook.Sheets;
            Excel.Worksheet worksheet = workbook.Sheets[1];
            worksheet.Select(System.Reflection.Missing.Value);
            string txtfilename = Dts.Variables["User::RXcurrentTextFilename"].Value.ToString();
            workbook.SaveAs(txtfilename, Excel.XlFileFormat.xlTextWindows);
            workbook.Close();
            workbooks.Close();
            app.Quit();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Marshal.FinalReleaseComObject(worksheets);
            Marshal.FinalReleaseComObject(worksheet);
            Marshal.FinalReleaseComObject(workbooks);
            Marshal.FinalReleaseComObject(workbook); 
            Marshal.FinalReleaseComObject(app);
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
            Console.WriteLine(ex.ToString());
            Dts.TaskResult = (int)ScriptResults.Failure;
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }

该变量RXcurrentTextFilename定义为由 UNC 路径、文件名、当前日期和文件扩展名组成的表达式,如下所示:

@[User::RXstagingFolder] + "_" + @[User::createDate]+@[User::RXtestFilename]

请注意,第一个变量包含 UNC 路径,第二个变量以 yyyymmdd 格式返回当前日期,第三个变量是静态值 MyTextFile.txt。

如何确保脚本任务使用与我的变量中定义的命名约定完全相同的文件创建文件?

标签: c#ssisoffice-interop

解决方案


推荐阅读