5

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

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

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

提前致谢...

4

4 回答 4

7

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

于 2012-06-29T08:57:04.223 回答
3

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

于 2015-07-20T13:45:01.543 回答
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),第二个类似于重新输入所有公式。

于 2015-10-09T20:21:33.557 回答
1

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

[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,例如,返回当前时间的函数。

于 2018-01-11T11:07:41.937 回答