我可以从SpreadsheetGear中的自定义函数调用电子表格函数吗?

时间:2014-11-19 10:50:31

标签: spreadsheetgear

我正在使用SpreadsheetGear并且已经获得了一个带有VBA宏的电子表格,我需要将其转换为自定义函数(因为SSG无法处理VBA代码)。宏调用Excel函数(匹配,索引),我无法看到如何从我的自定义函数中调用这些函数。任何想法,如果这是可能的,以及如何做到这一点?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用ISheet。EvaluateValue(...)方法评估Excel公式字符串。例如:

// A1:A3 on "Sheet1" will be summed up.
object val = workbook.Worksheets["Sheet1"].EvaluateValue("SUM(A1:A3)");

// Ensure we actually get a numeric value back
if(val != null && val is double)
{
    double sum = (double)val;
    Console.WriteLine(sum);
}

但是,听起来您将在自定义函数中使用此方法,因此我应该指出您不能将此方法用于属于当前正在计算的IWorkbookSet中的任何工作簿的任何工作表。请查看下面粘贴的函数。Evaluate(...)方法的备注部分中列出的规则,特别是我加粗的那些:


此方法的实施必须遵循许多规则:

  • 该方法必须是线程安全的。某些版本的SpreadsheetGear同时从多个线程调用此方法。
  • 除了IArguments.CurrentWorksheet.Name,IArguments.CurrentWorksheet.Index或IArguments.CurrentWorksheet.Workbook.Name 之外,该方法不得使用正在计算的工作簿集中的任何API。
  • 对单元格的所有访问都必须通过参数
  • 访问IArguments索引器具有将范围或数组的引用转换为单个简单值的副作用。使用GetArrayDimensions和GetArrayValue访问范围或数组的各个值。例如,如果第一个自定义函数参数是范围A1:C3,则在调试器中设置参数[0]上的监视会将此范围转换为单个简单值。
  • 在此方法完成执行后,不应使用在此方法执行期间传递或获取的接口或对象的引用。

因此,如果您在自定义函数中调用ISheet。EvaluateValue(...),则必须在某个属于IWorkbookSet的工作表上完成,而不是当前正在计算的工作表。根据上面提到的第一条规则,它还需要以线程安全的方式完成。