Вы можете оценить формулу строки Excel с помощью ISheet. EvaluateValue (...) способ. Пример:
// 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 вызывают этот метод из нескольких потоков одновременно.
- Метод не должен использовать какой-либо API в наборе рабочей книги, который вычисляется, за исключением IArguments.CurrentWorksheet.Name, IArguments.CurrentWorksheet.Index или IArguments.CurrentWorksheet.Workbook.Name.
- Весь доступ к ячейкам должен быть через аргументы.
- Доступ к индексу индекса IArguments имеет побочный эффект преобразования ссылок на диапазоны или массивы в одно простое значение. Используйте GetArrayDimensions и GetArrayValue для доступа к отдельным значениям диапазона или массива. Например, если первым аргументом пользовательской функции является диапазон A1: C3, установка часов в аргументах [0] в отладчике преобразует этот диапазон в одно простое значение.
- Никакие ссылки на интерфейсы или объекты, переданные или полученные во время выполнения этого метода, не должны использоваться после завершения этого метода.
Так что, если вы звоните ISheet. EvaluateValue (...) в вашей пользовательской функции, это должно быть сделано на каком-то листе, который принадлежит IWorkbookSet, отличному от того, который в настоящее время вычисляется. Это также необходимо было бы сделать поточно-безопасным способом, согласно первому правилу, упомянутому выше.
Спасибо за помощь. Я не заметил IArguments.currentWorksheet! Как оказалось, я заставил их переделать таблицу без макрокода, но это будет полезно для будущей справки. –