我有几个来自数据库的公式和数据。我想通过ExcelDna以编程方式刷新所有公式。所有这些公式都是ExcelFunctions,我已经把ExcelCommand name =“Refresh”放在其上,我想重新计算excel表格。
我使用以下内容但它只刷新本机excel函数,例如NOW(),SUM()等它不会在ExcelDna函数上调用刷新?
[ExcelCommand(MenuName="Refresh", MenuText="Refresh" )]
public static void GetPositionCommand()
{
XlCall.Excel(XlCall.xlcCalculateNow);
}
提前致谢...
答案 0 :(得分: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的另一种方法是在最新的Excel-DNA签到中创建RTD服务器或使用新的Reactive Extensions for Excel(RxExcel)支持。这里有一些信息 - http://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel。
答案 1 :(得分:3)
我必须按Ctrl + Alt + F9(至少在Excel 2013中)才能刷新单元格!
答案 2 :(得分: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),第二个类似于重新输入所有公式。
答案 3 :(得分:0)
尝试在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
,例如,返回当前时间的函数。