SSIS到Excel - Excel公式没有自动运行?

时间:2018-01-29 20:10:14

标签: sql-server excel ssis excel-formula etl

我创建了一个SSIS包,目前有以下步骤:

1 - 文件系统任务 - 复制Excel文件(.xlsx)以用作SSIS包输出的模板。 Excel文件有3个选项卡 - 一个没有数据,但是具有引用第二个和第三个选项卡上的值的公式。这是最终用户查看的页面(让我们称之为end_user)。

2 - 数据流任务 - OLEDB源 - >数据转换 - > Excel目标(选项卡2,我们称之为raw_data)。

3 - 电子邮件任务 - 尚未实施,但将在产品的最后阶段进行,以实现全自动化。

运行包完成后,我打开Excel文件,数据已写入raw_data,但是在end_user上没有显示任何内容。以下是我已经尝试过的,在Excel中解决此问题:

  • 文件 - >选项 - >公式 - >自动(它已经是)。我也尝试了其他所有选择(自动除了数据表,手动,手动与重新计算工作簿,然后保存,然后返回自动)。
  • 确保为raw_data和end_user中的每一列选择了适当的数据类型[即数字,货币,短日期等。]
  • 尝试将所有数据字段类型设置为常规
  • 使用其他Excel文件作为模板。
  • 将公式复制到记事本中,在Excel中放置一个随机数代替公式,保存并关闭文件,重新打开并重新放入公式。
  • 删除SSIS包(.dtsx)并重新创建。
  • 创建Excel宏以在文件打开时强制进行公式更新。

    Private Sub Workbook_Open()
    
    Application.Calculation = xlCalculationAutomatic
    
    End Sub
    
  • 在Office上运行修复。

  • 在Excel中按 Ctrl + Alt + F9 。 (这会使公式重新计算,并确实使值显示出预期的方式。

虽然 Ctrl + Alt + F9 选项使文件按预期显示,但这不是一个可接受的解决方案,因为我们都知道最终用户希望一切都完美无缺。有没有人有这方面的建议,经验或任何其他见解?非常感谢任何有用的东西!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的情况。所以即使这个问题已经超过 3 年了,我还是希望我的解决方案可以帮助其他人。

我使用以下 C# 代码创建了一个脚本任务(您只需编辑 TheNameOfYourExcelConnection.xls)。

该脚本将连接到电子表格,遍历每个工作表中的每个单元格,并将每次出现的“=”替换为自身。实际上并没有改变公式,而是强制重新计算它们。

#region Namespaces
using System;
using Microsoft.SqlServer.Dts.Runtime;


//add reference C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
using Excel = Microsoft.Office.Interop.Excel;
#endregion

namespace ST_10cafd32acda4eb1b677ebbdd2eb1286
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

        public void Main()
        {
            Excel.Application excelApp = new Excel.Application();
            ConnectionManager cm = Dts.Connections["TheNameOfYourExcelConnection.xls"];
            string filepath = cm.Properties["ExcelFilePath"].GetValue(cm).ToString();

            excelApp.DisplayAlerts = false;
            Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(filepath, 1, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, null, false);
            try
            {
                Excel.Sheets excelWorkSheet = excelWorkbook.Sheets;
                foreach (Excel.Worksheet work in excelWorkSheet)
                {
                    work.Cells.Replace("=", "=");

                }
                excelWorkbook.Save();
                excelWorkbook.Close();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                excelApp.Quit();
            }

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

        #region ScriptResults declaration
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}
相关问题