【问题标题】:Excel Dna - Refresh all Data Source and Formula CalculationExcel Dna - 刷新所有数据源和公式计算
【发布时间】:2012-06-29 03:07:38
【问题描述】:

我有几个来自数据库的公式和数据。我想通过 ExcelDna 以编程方式刷新所有公式。所有这些公式都是 ExcelFunctions,我已将 ExcelCommand name = "Refresh" 放在我想重新计算到 Excel 工作表的地方..

我使用以下功能,但它只刷新原生 excel 函数,例如NOW()、SUM() 等它不会在 ExcelDna 函数上调用刷新?

[ExcelCommand(MenuName="Refresh", MenuText="Refresh"   )]
        public static void GetPositionCommand()
        {
            XlCall.Excel(XlCall.xlcCalculateNow);
        }

提前谢谢...

【问题讨论】:

    标签: c# excel-dna


    【解决方案1】:

    xlcCalculateNow 将仅计算 Excel 知道必须重新计算的公式。您可以将 Excel 函数标记为“易失性”,使其行为类似于 Excel 的 NOW() 函数,该函数每次都会重新计算。使用 Excel-DNA,您可以做到这一点:

    [ExcelFunction(IsVolatile=true)]
    public static string MyVolatileNow()
    {
        return DateTime.Now.ToString("HH:mm:ss.fff");
    }
    

    并与默认的非易失性案例进行比较:

    [ExcelFunction]
    public static string MyNow()
    {
        return DateTime.Now.ToString("HH:mm:ss.fff");
    }
    

    将数据推送到 Excel 的另一种方法是创建 RTD 服务器或在最新的 Excel-DNA 签入中使用新的 Reactive Extensions for Excel (RxExcel) 支持。这里有一些信息 - http://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel

    【讨论】:

    • 谢谢;这种工作。但我更喜欢跟随;我创建函数 NonVolatile 并使用 Ctrl + Shift + F9 刷新所有 ExcelFunction。如果我让它变得不稳定;按下 Ctrl + Shift + F9 时,它会进入无限循环的更新.. 不确定乳清...
    • 当一个函数被标记为 Volatile 时,它​​会在用户每次执行一些操作(如调整列大小)时刷新。是否可以以编程方式刷新选定的函数(仅在运行自定义命令时)?
    【解决方案2】:

    我必须按 Ctrl + Alt + F9(至少在 Excel 2013 中)才能刷新单元格!

    【讨论】:

      【解决方案3】:

      这有效(至少在 Excel 2013 中):

      Excel.Application excelApp = ExcelDnaUtil.Application as Excel.Application;
      excelApp.CalculateFull();
      

      Excel.Application excelApp = ExcelDnaUtil.Application as Excel.Application;
      excelApp.CalculateFullRebuild();
      

      第一个重新计算所有工作簿(类似于按 Ctrl + Alt + F9),第二个类似于重新输入所有公式。

      【讨论】:

      • 这在 Excel 2010 中也适用于我,使用 IsVolatile=false UDF
      【解决方案4】:

      尝试在 ExcelDNA 函数的属性中设置IsVolatile=false

      [ExcelFunction(Description = "Subscribe to real time data.", IsVolatile = false, Category = UDF_CATEGORY)]
      public static object XSub(        
          string param1)
      {
          // Implementation here.
      }
      

      这个简单的更改显着降低了 CPU 使用率。在我使用的一个大型电子表格中,CPU 使用率从 100%(即不断重新计算,并且永远不会赶上)下降到 20%。

      使用IsVolatile=true,即使输入没有变化,Excel 也会定期重新计算函数的输出值。

      使用IsVolatile=false,Excel 只会在输入发生变化时重新计算函数的输出值。

      使用IsVolatile=false,一切的效率都提高了一个数量级,因为 Excel 在大多数情况下可以跳过重新计算 90% 的电子表格。

      说了这么多,有些函数可能需要IsVolatile=true,比如返回当前时间的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2018-09-23
        相关资源
        最近更新 更多