C# Excel Dna-刷新所有数据源和公式计算
我有一些公式和数据来自数据库。我想通过ExcelDna以编程方式刷新所有公式。所有这些公式都是excel函数,我已将EXCELCOMAND name=“Refresh”放在其中,我想对其发出“重新计算到excel工作表” 我使用以下命令,但它只刷新本机excel函数,例如NOW()、SUM()等。它不调用ExcelDna函数上的刷新吗C# Excel Dna-刷新所有数据源和公式计算,c#,excel-dna,C#,Excel Dna,我有一些公式和数据来自数据库。我想通过ExcelDna以编程方式刷新所有公式。所有这些公式都是excel函数,我已将EXCELCOMAND name=“Refresh”放在其中,我想对其发出“重新计算到excel工作表” 我使用以下命令,但它只刷新本机excel函数,例如NOW()、SUM()等。它不调用ExcelDna函数上的刷新吗 [ExcelCommand(MenuName="Refresh", MenuText="Refresh" )] public static v
[ExcelCommand(MenuName="Refresh", MenuText="Refresh" )]
public static void GetPositionCommand()
{
XlCall.Excel(XlCall.xlcCalculateNow);
}
提前感谢…xlcCalculateNow将只计算Excel知道必须重新计算的公式。您可以将Excel函数标记为“Volatile”,使其行为类似于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签入中使用新的Excel被动扩展(RxExcel)支持。这里有一些信息-。我必须按Ctrl+Alt+F9(至少在Excel 2013中)来刷新单元格 这是可行的(至少在Excel 2013中): 或
第一个类似于按Ctrl+Alt+F9重新计算所有工作簿,第二个类似于重新输入所有公式。在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
,例如,返回当前时间的函数。谢谢;这种方法奏效了。但我更喜欢跟随;我使函数非易失性,并使用Ctrl+Shift+F9刷新所有函数。如果我让它不稳定;点击Ctrl+Shift+F9时,它将进入无休止的更新循环。。不确定…当一个函数被标记为Volatile时,它会在用户每次执行某些操作(如调整列大小)时刷新。是否可以编程刷新所选函数(仅当运行自定义命令时)?这在Excel 2010中也适用,IsVolatile=false UDF
Excel.Application excelApp = ExcelDnaUtil.Application as Excel.Application;
excelApp.CalculateFullRebuild();
[ExcelFunction(Description = "Subscribe to real time data.", IsVolatile = false, Category = UDF_CATEGORY)]
public static object XSub(
string param1)
{
// Implementation here.
}