【问题标题】:SSIS to Excel - Excel Formulas not running automatically?SSIS 到 Excel - Excel 公式没有自动运行?
【发布时间】:2018-07-08 14:49:54
【问题描述】:

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

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

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

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

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

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

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

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

虽然 Ctrl + Alt + F9 选项使文件按预期显示,但众所周知,这不是一个可接受的解决方案最终用户如何希望一切都能完美运行。有没有人有任何建议,发生这种情况的经验或任何其他见解?非常感谢任何有用的东西!

【问题讨论】:

  • 您可以运行脚本任务来执行相同的刷新。我有预感 SSIS 不会有任何与生俱来的功能。 Excel 驱动程序很糟糕。我很惊讶宏选项对你不起作用。也许如果您包含我们可以排除故障的代码?
  • @JacobH - 感谢您的回复和好主意。我在上面的描述中添加了它。
  • Worksheets("end_user").Calculate 尝试将此添加到宏中
  • 那是负面的先生。没用。
  • 您是否尝试使用 xltx 甚至 xltm 文件类型而不是 xlsx 格式?

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


【解决方案1】:

我也有同样的情况。所以即使这个问题已经超过 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

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多