2012-06-29 53 views
2

我有几个公式和数据来自数据库。我想通过ExcelDna以编程方式刷新所有公式。所有这些公式是ExcelFunctions,我已经把ExcelCommand名称=“刷新”,我想发布重新计算Excel表格。 NOW(),SUM()等,它不会调用ExcelDna函数的刷新?Excel Dna - 刷新所有数据源和公式计算

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

在此先感谢...

+0

我正在使用Excel Office 2007 – Ocean

回答

5

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(RxExcel)的反应性扩展支持最新的Excel-DNA签入。一些信息在这里 - http://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel

+0

谢谢;这种工作。但我更喜欢跟随;我使用NonVolatile函数,并用Ctrl + Shift + F9刷新所有ExcelFunction。如果我使它变得不稳定;它按Ctrl + Shift + F9进入无限循环更新..不确定乳清... – Ocean

+0

当标记为易失性的功能时,每当用户采取某些操作(如列调整大小)时,都会刷新该功能。是否有可能编程刷新选定的功能(仅当运行自定义命令时)? –

2

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

2

这工作(至少在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),第二个类似于重新输入所有公式。

+0

这对我来说也适用于Excel 2010,IsVolatile = false UDF –

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