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 / и т. Д.

Другие вопросы по тегам