C# SpreadSheetGear: #NAME? как текст, если формула применяется к ячейке
Я пытаюсь получить текст в ячейке с помощью библиотеки электронных таблиц.
Существует формула, примененная к столбцу C1 =GETURL(I2)
и он оценивает текст, который похож на " https://loremipsum.com/2345/view"
У меня есть другой столбец C2 с формулой, которая выводит "View" в виде текста
=HYPERLINK(CONCATENATE("https://loremipsum.com/",[@[Customer CID]],"/view"), "View")
Теперь, когда я пытаюсь получить текст с помощью кода C# для ячеек в столбце C2, я получаю "View", когда запускаю приведенный ниже оператор и "#Name?" для клеток в столбце C1.
worksheet.Cells[i, j].Text; //Outputs = "#NAME?"
Я пытался использовать =TEXT(GETURL(I2), "")
в Excel, но все равно выводит #Name! Я тоже пытался делать worksheet.Cells[i, j].Value //Output = Name
Почему одно и то же утверждение дает мне разные результаты, даже если к обеим ячейкам применена формула?
Function GETURL(cell As Range, Optional default_value As Variant)
With cell.Range("A1")
If .Hyperlinks.Count = 1 Then
GETURL = .Hyperlinks(1).Address
Else
If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
Dim indexFirstArgument As Long: indexFirstArgument = InStr(.Formula, "(") + 1
GETURL = Application.Evaluate(Mid$(.Formula, indexFirstArgument, InStrRev(.Formula, ",") - indexFirstArgument))
Else
GETURL = default_value
End If
End If
End With
End Function
1 ответ
Что касается стороны SpreadsheetGear, обратите внимание, что SpreadsheetGear не может выполнять код VBA (хотя он сохраняет VBA в существующих файлах XLS или XLSM). SpreadsheetGear поддерживает добавление ваших собственных пользовательских функций, но вы должны реализовать это через SpreadsheetGear. CustomFunctions API в вашем.NET-приложении. Если пользовательская функция недоступна, SpreadsheetGear вернет #NAME! ошибки, когда он сталкивался с функциями, такими как GETURL, и я подозреваю, что это происходит в вашем случае.
Чтобы реализовать пользовательскую функцию в SpreadsheetGear, вы в основном должны создать подкласс класса Function и переопределить его метод Evaluate(...), который вызывается всякий раз, когда SpreadsheetGear встречает вашу пользовательскую функцию в формуле. В документе есть примеры, но вы также можете найти полнофункциональный пример ASP.NET здесь:
https://www.spreadsheetgear.com/support/samples/asp.net.sample.aspx?sample=customfunctions
ВАЖНО! У пользовательских функций SpreadsheetGear есть ряд правил, которые вы должны соблюдать. Я настоятельно рекомендую вам ознакомиться с этими правилами, изложенными в разделе "Замечания" документации по методу Function.Evaluate(...), приведенному в приведенной выше ссылке. Одно из этих правил заключается в том, что весь доступ к ячейкам должен осуществляться через аргументы, предоставленные для Evaluate (...) через параметр IArguments.
Ваша функция GETURL, по-видимому, обращается к Range, его коллекции гиперссылок, Formula и т. Д. Эти виды действий не разрешены в API пользовательских функций SpreadsheetGear. Все, к чему у вас будет доступ, - это то, что обеспечивается IArguments, который в случае передачи диапазона в вашу пользовательскую функцию будет лежать в основе вычисляемых значений этих ячеек. Другими словами, ваша функция GETURL, как она реализована выше, не будет работать, перенесенная в пользовательскую функцию SpreadsheetGear. Вам нужно будет обновить его так, чтобы вы не обращались к IRange / IRange.Hyperlinks / и т. Д.